rah*_*ngh 2 php laravel eloquent
我正在尝试实现一个sql查询
select * from user,comments where comments.user_id= user.id
Run Code Online (Sandbox Code Playgroud)
所以我getcomments使用以下代码在我的用户模型上创建一个方法
public function comments(){return $this->hasMany('Comments')}
Run Code Online (Sandbox Code Playgroud)
现在正在通过以下方式访问数据
$data = User::find(1)->comments;
Run Code Online (Sandbox Code Playgroud)
但它只给了我来自评论表的数据(不是用户和评论)我该怎么做
Eloquent ORM 遵循 Active Record 模式。当您编写纯 SQL 语句时,思考建模和与数据交互的方式略有不同。
建立评论关系是很好的一步。现在您需要考虑如何与数据交互。
您可以通过以下语句获取所有信息:
$user = User::with('comments')->find(1);
Run Code Online (Sandbox Code Playgroud)
通过此语句,所有用户信息都将加载到$user对象中,所有评论信息将加载到$user->commentsCollection 属性中。可以像这样访问此信息:
// get the info
$user = User::with('comments')->find(1);
// display some user info
echo $user->first_name;
echo $user->last_name;
// loop through the comment Collection
foreach($user->comments as $comment) {
// display some comment info
echo $comment->text;
}
Run Code Online (Sandbox Code Playgroud)
该with('comments')部分告诉查询立即加载返回用户的所有评论(在本例中,仅加载 id 1 的评论)。如果您没有急切加载它们,那么当您尝试访问它们时,它们会自动延迟加载。如果没有with('comments'). 但是,当您加载多个父记录(而不是仅加载一个)时,预加载就变得更加重要,因为它解决了 N+1 问题。您可以在此处阅读有关急切加载的信息。
注意(我添加新答案的原因):
User::find(1)->with('comments')->get();,正如其他建议的那样,不会提供您正在寻找的信息。这实际上最终会返回所有用户,并加载他们的评论。原因如下:
首先,User::find(1)将返回 id 为 1 的一个用户,这很好。但是,它随后调用with('comments')此模型,该模型实际上为用户表创建一个新的查询构建器实例。最后,它调用get()这个新的查询构建器实例,并且由于它没有任何约束,因此它将返回表中的所有用户,以及附加到那些急切加载的用户的所有注释。
| 归档时间: |
|
| 查看次数: |
7201 次 |
| 最近记录: |