Laravel:附加需要跟随负载吗?

时间:2018-12-12 03:37:30

标签: php laravel eloquent laravel-5.7

在此示例中,考虑具有多对多关系的模型UserComment

在用户模型中:

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, ...} ]

感觉很奇怪和多余。有更好的方法吗?

2 个答案:

答案 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();

不确定这是否让您感到奇怪,但这是从数据库刷新所有用户属性和关系的一种干净方法。