拉拉韦雄辩的关系有许多疑问


laravel eloquent relationship hasmany query

我正在尝试实现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;
}