使用 Eloquent 将两个查询合并为一个

Merging two queries into one using Eloquent

我有这两个查询来显示 3 个表用户、评论和帖子中的信息。所以我做了这个功能:

public function show($id)
    {
        $posts = Post::with(['comments'])->findOrFail($id);
        $user = User::find($posts->user_id);

        echo "<h1>".$posts->title.'</h1>';
        echo "<h2>".$user->name.'</h2>';

        foreach ($posts->comments as $comment) {
            echo $comment->body.'<br>';
        }
    }

在这个函数上我使用了两个变量 $posts 和 $user,我可以使用像 Post::with(['user',[=29= 这样的 eloquests 命令合并这两个变量吗]])'?所以我可以只使用 $posts 变量并像 $posts->users->name 一样使用它来访问用户名。

我正在尝试使用这种方式:

$posts = Post::with(['comments','users'])->findOrFail($id);

但是当我回显 post 它显示用户为 null:

{"id":1,"user_id":1,"title":"Oleh id 1","body":"ini adalah content","created_at":"2017-10-18 03:25:54","updated_at":"2017-10-18 03:25:54","comments":[{"id":1,"post_id":1,"body":"Keren banget deh artikelnya, TOP","created_at":"2017-10-18 03:43:50","updated_at":"2017-10-18 03:43:50"},{"id":2,"post_id":1,"body":"Keren banget deh artikelnya, TOP","created_at":"2017-10-18 03:43:53","updated_at":"2017-10-18 03:43:53"},{"id":3,"post_id":1,"body":"Keren banget deh artikelnya, TOP","created_at":"2017-10-18 03:43:54","updated_at":"2017-10-18 03:43:54"}],"users":null}

如果您需要,这是我的模型。我的 post 模特:

class Post extends Model
{
    /**
     * Get the comments for the blog post.
     */
    public function comments()
    {
        return $this->hasMany('App\Comment');
    }

    public function users(){
        return $this->belongsTo('App\User');
    }
}

我的评论模型

class Comment extends Model
{
    /**
     * Get the post that owns the comment.
     */
    public function post()
    {
        return $this->belongsTo('App\Post');
    }
}

我猜您想要的是用户所有帖子的列表。如果定义了关系,请尝试使用 join

$posts   =   DB::table('posts')
             ->join('users', 'users.id', '=', 'posts.user_id')
             ->select('posts.*', 'users.name as user_name')
             ->where('posts.comments', '<>', NULL)
             ->get();

@注意:如果您正在使用 soft deletes,您可能想添加 where('posts.deleted_at', null)

您将更容易遵守 Laravel 的命名关系约定。

一个Post有多个Comments,属于一个User。鉴于此设置:

class Post extends Model
{
    public function comments()
    {
        return $this->hasMany(Comment::class);
    }
}

class Comment extends Model
{
   public function post()
   {
       return $this->belongsTo(Post::class);
   }

   public function user()
   {
       return $this->belongsTo(User::class);
   }
}

你可以这样查询post的评论和用户:

$comments = $post->comments()->with('user')->get();

如果您总是希望用户返回评论,您也可以在 comments 上预先加载 user 关系:

class Comment extends Model
{
    protected $with = ['user'];

    public function user()
    {
        return $this->belongsTo(User::class);
    }
}

那么您的查询将得到简化:

$comments = $post->comments;

希望对您有所帮助!!

经过几天的搜索终于得到了答案,我可以像这样合并查询:

$posts = Post::with(['comments','users'])->findOrFail($id);

但在 Post 模型中,函数不是 "Users",而是 "User"。