laravel 雄辩的关系有很多查询

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)

但它只给了我来自评论表的数据(不是用户和评论)我该怎么做

pat*_*cus 5

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()这个新的查询构建器实例,并且由于它没有任何约束,因此它将返回表中的所有用户,以及附加到那些急切加载的用户的所有注释。