我们在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>
答案 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)