在此示例中,考虑具有多对多关系的模型User
和Comment
。
在用户模型中:
public function comments() {
return $this->belongsToMany(Comment::class);
}
现在,我为用户添加评论:
$user->comments()->attach($comment)
此行将条目添加到数据库数据透视表中。
但是,如果我现在检查$user->comments
的值,它仍然是[]
。为了使对象保持最新状态,我最终不得不执行以下操作:
$user->comments()->attach($comment);
echo $user->comments; // []
$user->load('comments');
echo $user->comments; // [ {id => 1, ...} ]
感觉很奇怪和多余。有更好的方法吗?
答案 0 :(得分:1)
您的SUM(transaction.shares) shares
方法是最精确的,在某些情况下也是最准确的。
您的->load()
将检查您是否已经加载了注释关系(即:在此请求的前面称为echo $user->comments
或使用了类似$user->comments
的东西)。我假设您已经附加了评论,然后再次调用它只会返回最初加载的评论(这可以防止对关系的每次调用都执行新的查询)。
使用->with('comments')
将执行一个查询,该查询将刷新注释并为您提供更新的结果。
但是!如果您想避免执行此附加查询,因为您已经拥有所有数据,则可以。
您可以将新添加的注释手动附加到注释关系(集合):
->load(..)
但是,再次使用上述方法可能会带来意想不到的后果。例如,如果$user->comments()->attach($comment);
$user->comments->push($comment); // Will manually add the new comment to the existing collection
表中的某些列使用SQL默认值,并且在创建注释时未明确分配,则您将看不到这些列。
因此,tldr:除非性能至关重要,并且您负担不起额外的查询,否则我会坚持使用您原来的解决方案。
答案 1 :(得分:0)
在再次访问评论之前运行此命令:
$user->refresh();
不确定这是否让您感到奇怪,但这是从数据库刷新所有用户属性和关系的一种干净方法。