Laravel查询构建器。返回嵌套的结构化数据

时间:2016-08-24 15:34:44

标签: mysql database laravel eloquent laravel-5.3

我有一些查询需要一段时间,因为这些集很大。

我现在正在通过Laravel查询构建器直接通过Laravel查询构建器执行它们。

将两个表连接在一起时,表B中的字段将合并到表A的结果中。

是否可以将数据嵌套在子对象或数组中?

e.g。

\DB::table('posts')
    ->select('posts.id', 'posts.title', 'comments.name', 'comments.id')
    ->where('posts.status', '=', 'PUBLIC')
    ->leftJoin('comments', 'posts.comment_id', '=', 'comments.id')
    ->get();

返回类似的内容:

{
  id: 123,
  title: 'My post',
  name: 'Comment name',
  // ...
}   

我希望:

{
  id: 123,
  title: 'My post',
  comment {
    name: 'Comment name',
    // ...
  }
  // ...
}   

2 个答案:

答案 0 :(得分:-1)

你可以用雄辩的关系来做到这一点。

首先,声明模型中的关系。例如,在 Post.php

class Post extends Model
{
    // ...     

    public function comments()
    {
        return $this->hasMany('App\Comment');
    }
}

现在,您可以在查询中使用with('comments')

它应该返回一个类似于你想要的对象。

请参阅文档中的Eloquent Relationships,尤其是“预先加载”部分。

答案 1 :(得分:-2)

而不是使用()

的查询构建器

您需要在模型中定义注释Post的函数

public function posts(){
   return $this->belongsTo('App\Post', 'posts_id');
}

然后在您的控制器中

$result = Post::with('comments')->where('status', '=', 'PUBLIC')->select('comments')->get();