获取hasMany关系上的特定字段

时间:2015-05-04 03:09:28

标签: php laravel laravel-5 eloquent

我有一个 hasMany 关系函数,如下所示:

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

并像这样使用它:

$data = \App\User::with('articles')->get();

我没有遇到任何问题,因为它返回了预期的数据。像这样:

{
"id": 1,
"name": "Jhon",
"lastname": "Doe",
"articles": [
    {
        "id": 1,
        "title": "Article 1",
        "status": "published",
        "published_at": "2015-04-30"
    },
    {
        "id": 2,
        "title": "Article 2",
        "status": "draft",
        "published_at": null
    }
 ]
}

我想要实现的目标,但我仍然无法获取关系字段的一部分来获取此信息:

{
"id": 1,
"name": "Jhon",
"lastname": "Doe",
"articles": [
    {
        "id": 1,
        "title": "Article 1"
    },
    {
        "id": 2,
        "title": "Article 2"
    }
  ]
}

我的目的是找到一种方法来指定模型函数中的字段子集,而不是迭代返回的集合并取消设置不需要的字段。

这可能吗?

2 个答案:

答案 0 :(得分:16)

你有几个选择:

  1. 使用时修改关系查询。 with()方法可以接受键/值对的数组,其中键是关系的名称,值是修改关系查询的Closure。

    $data = \App\User::with(['articles' => function($query) {
        $query->select(['id', 'title', 'user_id']);
    }])->get();
    
  2. 创建一个包含所需字段的新关系。

    public function articleTitles() {
        return $this->hasMany('App\Article')->select(['id', 'title', 'user_id']);
    }
    
    $data = \App\User::with('articleTitles')->get();
    
  3. 如果您只关心数组/ json输出,则可以修改App \ Article模型,以便在转换为数组时仅显示id和title。

    class Article extends Model {
        protected $visible = ['id', 'title'];
    }
    
  4. 您选择的内容取决于您的需求。

    注意:对于上面的选项1和2,必须选择外键(user_id),以便Laravel知道在构建关系时如何将模型链接在一起。

答案 1 :(得分:0)

$data = \App\User::with('articles:id,title,user_id')->get();

// user_id在hasmay关系中很重要