Laravel Eloquent 从一个表中选择并在另一个表中有匹配项时加入第一行

Posted

技术标签:

【中文标题】Laravel Eloquent 从一个表中选择并在另一个表中有匹配项时加入第一行【英文标题】:Laravel Eloquent select from one table and join first row if there's a match from another table 【发布时间】:2020-08-25 11:06:54 【问题描述】:

我有两张桌子

+----+------------+------------+
| id | first_name | date       |
+----+------------+------------+
| 1  | Bob        | 01/01/2019 |
+----+------------+------------+
| 2  | June       | 01/05/2019 |
+----+------------+------------+

+----+--------+---------+------------+
| id | userID | comment | date       |
+----+--------+---------+------------+
| 1  | 1      | Hello   | 02/01/2019 |
+----+--------+---------+------------+
| 2  | 1      | Again   | 02/02/2019 |
+----+--------+---------+------------+
| 3  | 2      | Howdy   | 02/03/2019 |
+----+--------+---------+------------+

我想获取所有名字为 Bob 的用户的结果,并将最新的评论附加到该结果。

我可以的

$users = SELECT * FROM Users WHERE id = 1

然后

foreach($users as $user)
    $comment = Comment::where("userID", $user->id)->first();
    if($comment != null)
        $user->comments = $comment->$comment;
    

但是如果 $users 中有很多结果会很慢

【问题讨论】:

我的回答对您的问题有帮助吗?否则我很高兴尝试修复它:) 【参考方案1】:

使用 Eager loading 和自定义查询:

User::with(['comments' => function($query)
  $query->latest();
])->where('first_name','bob')->get();

【讨论】:

【参考方案2】:

额外的关系可以解决问题。

public function latestComment()

    return $this->hasOne(Comment::class)->latest('date');

现在您可以通过$user->latestComment 访问它。

【讨论】:

以上是关于Laravel Eloquent 从一个表中选择并在另一个表中有匹配项时加入第一行的主要内容,如果未能解决你的问题,请参考以下文章

Laravel - 使用 Eloquent 从连接关系模型中选择特定列

Laravel 在急切加载时使用 Eloquent 选择特定列

从Laravel和Eloquent的桌子中选择所有

Laravel Eloquent - 使用连接选择列文本类似于其他表中的列文本

Laravel Eloquent,仅选择存在关系的行

使用 laravel eloquent 从两个连接表中获取数据