2015-05-04 70 views
2

我有一個的hasMany關係函數這樣的具體領域:取上的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" 
    } 
    ] 
} 

我的目的是要找到一個方式來指定模型函數中的字段子集,而不是迭代返回的集合並取消不需要的字段。

這可能嗎?

回答

8

你有幾個選擇:

  1. 使用時修改相關查詢。 with()方法可以接受一組鍵/值對,其中鍵是關係的名稱,值是修改關係查詢的Closure。

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

    public function articleTitles() { 
        return $this->hasMany('App\Article')->select(['id', 'title']); 
    } 
    
    $data = \App\User::with('articleTitles')->get(); 
    
  3. 如果你只關心陣列/ JSON輸出,可以修改應用程序\文章模型時轉換爲一個數組,只顯示編號和標題。

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

你選擇什麼取決於你所需要的。

+0

我以前嘗試過沒有成功的選項2,因爲它在「文章」中返回空。今天我嘗試了選項1,並在「文章」中返回空白。我試過$ query-> orderBy('id','asc');和工作,但與「選擇」方法不起作用。 – Tony

+0

@Tony使用選項1或2時,必須確保已將外鍵包含在select語句('id')中,否則Laravel將不知道如何將對象鏈接在一起,並且文章屬性將始終空着。 – patricus

+1

這是使它工作的一塊!在你的評論之後,我這樣做了: 'return $ this-> hasMany('App \ Article') - > select(''id','title','user_id']);' Foreign_key是答案。謝謝@patricus – Tony