获取 has 多个关系上的特定字段

2022-08-30 17:32:10

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

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"
    }
  ]
}

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

这可能吗?


答案 1

是的,这是可能的。您有几个选择。

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

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

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

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

     class Article extends Model {
         protected $visible = ['id', 'title'];
     }
    

您的选择取决于您的需求。


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

user_id在夫妻关系中很重要


推荐