获取hasMany关系上的特定字段

Ton*_*ony 8 php laravel eloquent laravel-5

我有一个像这样的hasMany关系函数:

public function articles()
{
    return $this->hasMany('App\Article');
}
Run Code Online (Sandbox Code Playgroud)

并像这样使用它:

$data = \App\User::with('articles')->get();
Run Code Online (Sandbox Code Playgroud)

我没有任何问题,因为它返回了预期的数据.像这样的东西:

{
"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
    }
 ]
}
Run Code Online (Sandbox Code Playgroud)

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

{
"id": 1,
"name": "Jhon",
"lastname": "Doe",
"articles": [
    {
        "id": 1,
        "title": "Article 1"
    },
    {
        "id": 2,
        "title": "Article 2"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

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

这可能吗?

pat*_*cus 21

你有几个选择:

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

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

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

    class Article extends Model {
        protected $visible = ['id', 'title'];
    }
    
    Run Code Online (Sandbox Code Playgroud)

你选择什么取决于你需要什么.

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

  • 这是让它发挥作用的作品!在您发表评论之后,我这样做:`return $ this-> hasMany('App\Article') - > select(['id','title','user_id']);`那个foreign_key就是答案.谢谢@patricus (5认同)

Jes*_*vin 13

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

// user_id 在 hasmay 关系中很重要

  • 你是活生生的救星, // *user_id 在 hasmay 关系中很重要(伟大的人)。谢谢 (2认同)