2015-11-05 3 views
3

Большая проблема, с которой мы сталкиваемся в нашем веб-приложении, заключается в том, что экземпляры часто не синхронизируются. То есть, представьте, что у нас есть сообщение с ответами.Синхронизировать Laravel Красноречивые экземпляры

class Post extends Model 
{ 
    public function replies() 
    { 
     return $this->hasMany('Reply'); 
    } 
} 

class Reply extends Model 
{ 
    public function post() 
    { 
     return $this->belongsTo('Post'); 
    } 
} 

Если я знаю, что получить все ответы, используя $post->replies, я могу получить пост для каждого ответа $r с помощью $r->post снова. Это не выполняет новый запрос, потому что, очевидно, его значение заполняется при загрузке всех ответов. Однако я заметил, что каждый экземпляр $r->post является другим экземпляром Post, чем оригинал.

Здесь возникают проблемы, потому что в нашем (возможно, более сложном) приложении мы часто вызываем методы ответа, а когда мы переходим в наше приложение с использованием нашего оригинального сообщения, оно еще не обновлено в соответствии с изменениями, которые могут быть получены.

Лично я бы очень хотел гарантировать, что эти экземпляры равны. Точнее, каждый раз, когда я извлекаю объект, используя, например, Post::find($id) Я бы хотел, чтобы тот же экземпляр принимал $id. Есть ли способ заставить это поведение? Я рассматривал использование кеша в некотором роде, но для этого потребовалось бы много кэширования, и я не уверен, как убедиться, что код Laravel, который имеет дело с этими отношениями, может повлиять на выбор экземпляра из кеша.

+0

Я бы хотел больше вашего приложения, так что я мог бы получить более глубокое понимание что здесь происходит .. Похоже, пользователи на сайте создают ответ, который изменяет сообщение, но затем следующий пользователь, который пытается загрузить этот пост, получает старую почту? Что вы имеете в виду «когда мы переходим в наше приложение, используя наш оригинальный пост»? Ответ происходит в середине выполнения, где вы уже загрузили сообщение? –

+0

Вам определенно нужно опубликовать код, который демонстрирует то, что вы объяснили, потому что объяснение само по себе слишком запутано. – Bogdan

+0

Это не полный ответ, но вы говорите о различии между экземплярами VS-адресации. Вам нужно как-то выделить ваши $ posts. Это не очень «красноречиво», но это может выглядеть так: '$ posts [$ id] ['replies'] [$ replyId] -> cool_reply_method()' Разница заключается в том, что адрес объекта PERSISTS in родительский массив, который впоследствии может быть адресован, и вы получите тот же экземпляр объекта. Мне было бы любопытно, каким будет красноречивый способ справиться с этим. –

ответ

0

У меня такая же ситуация при запуске приемочных испытаний.

Вот обходной путь, который у меня есть на данный момент, пока не смогу понять, почему в некоторых средах экземпляр PDO, похоже, заблокирован.

Дубликат подключение по умолчанию в config/database.php:

'mysql' => [ 
    'driver' => 'mysql', 
    'host'  => env('DB_HOST'), 
    'database' => env('DB_DATABASE'), 
    'username' => env('DB_USERNAME'), 
    'password' => env('DB_PASSWORD'), 
    'charset' => 'utf8', 
    'collation' => 'utf8_unicode_ci', 
    'prefix' => '', 
    'strict' => false, 
], 

'mysql_alt' => [ 
    'driver' => 'mysql', 
    'host'  => env('DB_HOST'), 
    'database' => env('DB_DATABASE'), 
    'username' => env('DB_USERNAME'), 
    'password' => env('DB_PASSWORD'), 
    'charset' => 'utf8', 
    'collation' => 'utf8_unicode_ci', 
    'prefix' => '', 
    'strict' => false, 
] 

Теперь, при необходимости вы можете выполнить следующие:

Model::on('mysql_alt')->find($id)