同步Laravel Eloquent实例

时间:2015-11-05 15:00:51

标签: php laravel laravel-5

我们在Web应用程序中遇到的一个大问题是实例经常不同步。也就是说,假设我们有一个回复帖子。

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代码可能会受到影响以从缓存中获取实例。< / p>

1 个答案:

答案 0 :(得分: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)