Php 拉威尔雄辩的关系有很多疑问

Php 拉威尔雄辩的关系有很多疑问,php,laravel,eloquent,Php,Laravel,Eloquent,我正在尝试实现一个sql查询 因此,我使用以下代码在我的用户模型上创建了一个getcomments方法 public function comments(){return $this->hasMany('Comments')} 现在我通过 $data = User::find(1)->comments; 但它只提供了来自评论表的数据(不是用户和评论) 如何在找到用户后执行此操作。然后访问所有用户数据和用户的所有评论 $data = User::find(1); //or you

我正在尝试实现一个sql查询

因此,我使用以下代码在我的用户模型上创建了一个
getcomments
方法

public function comments(){return $this->hasMany('Comments')}
现在我通过

$data = User::find(1)->comments;
但它只提供了来自评论表的数据(不是用户和评论)
如何在找到用户后执行此操作。然后访问所有用户数据和用户的所有评论

$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;
}

您只获取您按id选择的用户的评论。您应该这样做

User::find(1)->with('comments')->get();

雄辩的ORM遵循活动记录模式。当您编写纯sql语句时,这是一种稍微不同的方式来考虑建模和与数据交互

建立评论关系是一个很好的步骤。现在,您需要考虑如何与数据交互

您可以通过以下语句获得所有信息:

$user = User::with('comments')->find(1);
使用此语句,所有用户信息都加载到
$user
对象中,所有注释信息都加载到
$user->comments
集合属性中。可以通过以下方式访问此信息:

// 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的用户)加载所有注释。如果您不急于加载它们,那么当您尝试访问它们时,它们会自动延迟加载。如果没有带有('comments')的
,上述代码的工作原理将完全相同。但是,当加载多个父记录而不是一个父记录时,即时加载变得更加重要,因为它解决了N+1问题。你可以读到

注意(我添加新答案的原因):

User::find(1)->with('comments')->get(),正如另外建议的那样,不会提供您要查找的信息。这实际上会返回所有用户,并加载他们的评论。原因如下:


首先,
User::find(1)
将返回一个id为1的用户,这很好。但是,它随后在此模型上调用带有('comments')的
,这实际上为users表创建了一个新的查询生成器实例。最后,它在这个新的查询生成器实例上调用
get()
,由于它没有任何约束,它将返回表中的所有用户,并将所有附加到这些用户的注释加载到这些用户上。

为什么不加载这些用户就可以工作?你能告诉我更多细节吗?快速加载只是一种性能解决方案。它会在找到用户时加载所有注释。如果不使用即时加载,则在键入:$data->comments时将加载注释。您的解决方案很好,但它应该在没有紧急加载的情况下工作。实际上您是对的,但我认为如果您在没有紧急加载的情况下编写代码,项目将失去一点性能。因为这个项目需要一次又一次的开发。你今天就可以获取评论,但明天会有另一个请求。一些开发人员可以在视图中使用您的方法。如果开发人员很小心,就可以了。如果他/她不是,我认为会有性能问题。请查看我的答案,了解您建议的解决方案的信息。
// 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;
}