【发布时间】:2015-11-05 15:00:51
【问题描述】:
我们在 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->post 检索每个回复$r 的帖子。这不会执行新的查询,因为显然它的值是在加载所有回复时填写的。然而,我确实注意到$r->post 的每个实例都是Post 的不同实例而不是原始实例。
这是问题开始的地方,因为在我们的(可以说是更复杂的)应用程序中,我们经常在回复上调用方法,然后当我们使用原始帖子继续我们的应用程序时,它还没有根据回复可能所做的更改。
就个人而言,我非常希望这些实例是平等的。更准确地说,每次我使用例如检索对象时Post::find($id) 我想要相同的实例,假设 $id 是相等的。有没有办法强制这种行为?我考虑过以某种方式使用缓存,但它需要大量缓存,而且我不确定如何确保处理这些关系的 Laravel 代码也会受到影响以从缓存中获取实例。
【问题讨论】:
-
我希望我有更多你的应用程序,这样我就可以更深入地了解这里发生的事情。听起来网站上的用户创建了一个修改帖子的回复,但是下一个用户尝试加载该帖子正在获取旧帖子?你是什么意思“当我们使用我们的原始帖子继续我们的应用程序时”?回复发生在您已经加载帖子的执行过程中?
-
你肯定需要发布一些代码来展示你所解释的内容,因为它本身的解释太复杂了。
-
这不是一个完整的答案,但您正在谈论实例化 VS 寻址之间的区别。您需要以某种方式单身您的 $posts 。这不是很“雄辩”,但它可能看起来像:
$posts[$id]['replies'][$replyId]->cool_reply_method()两者之间的区别在于父数组中的已寻址对象 PERSISTS 可以稍后被寻址,并且您将获得相同的对象实例。我很好奇处理这个问题的雄辩方式是什么。