我正在尝试实现sql查询
select * from user,comments where comments.user_id= user.id
因此,我在我的用户模型上创建了一个getcomments
方法,代码如下
public function comments(){return $this->hasMany('Comments')}
现在正在通过访问数据
$data = User::find(1)->comments;
但它只给了我来自评论表的数据(而不是用户和评论)我该怎么做这个
Eloquent ORM遵循活动记录模式。当您编写纯sql语句时,考虑建模和与数据交互的方式略有不同。
建立评论关系是一个很好的步骤。现在,您需要考虑如何与数据交互。
您可以通过以下语句获得所有信息:
$user = User::with('comments')->find(1);
使用此语句,所有的用户信息都将加载到$user
对象中,所有的注释信息都将载入到$user->comments
Collection属性中。这些信息可以这样访问:
// 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;
}
with('comments')
部分告诉查询急切地加载返回用户的所有注释(在本例中,只有id为1的用户)。如果你不急于加载它们,当你试图访问它们时,它们会自动延迟加载。如果没有with('comments')
,上面的代码将完全相同。然而,当加载多个父记录而不是仅加载一个父记录时,急切加载变得更加重要,因为它解决了N+1问题。你可以在这里阅读有关热切装载的信息。
注意(我添加新答案的原因):
User::find(1)->with('comments')->get();
,正如另外建议的那样,不会提供您想要的信息。这实际上最终会返回所有用户,并加载他们的评论。原因如下:
首先,User::find(1)
将返回id为1的一个用户,这很好。然而,它随后在此模型上调用with('comments')
,这实际上为users表创建了一个新的查询生成器实例。最后,它在这个新的查询生成器实例上调用get()
,由于它没有任何约束,它将返回表中的所有用户,并将所有注释附加到那些渴望加载的用户。
您只获取用户的注释,您可以通过id选择这些注释;
User::find(1)->with('comments')->get();
首先找到一个用户。然后访问所有用户数据,以及用户的所有评论。
$data = User::find(1);
//or you can use eager loading for more performance. thanks for @Özgür Adem Işıklı
$data = User::with('comments')->find(1);
//access user data
$data->id;
$data->email; //etc.
//user's comments:
foreach($data->comments as $comment) {
//access comment detail
$comment->id;
$comment->title;
}