2014-02-08 76 views
4

因此,我通過數據透視表user_photo在用戶和照片之間建立了多對多的關係。我在我的用戶模型中使用belongsToMany('Photo')。然而,這裏的麻煩是,我的照片表中有十幾列,大多數我不需要(特別是在json響應期間)。因此,一個例子是:Laravel belongsToMany僅返回特定列

//Grab user #987's photos: 
User::with('photos')->find(987); 
//json output: 
{ 
    id: 987, 
    name: "John Appleseed", 
    photos: { 
    id: 5435433, 
    date: ..., 
    name: 'feelsgoodman.jpg', 
    ....// other columns that I don't need 
    } 
} 

是否有可能修改這一方法,使得Photos模式將只返回被接受的列(比如通過一個數組['name', 'date']規定)?

user.php的

public function photos() 
{ 
    return $this->belongsToMany('Photo'); 
} 

注:我只想只做一個User->belongsToMany->Photo時選擇特定的列。當做類似Photo::all()的事情時,是的,我希望所有列都正常。

編輯:我試過Get specific columns using "with()" function in Laravel Eloquent但列仍被選中。另外https://github.com/laravel/laravel/issues/2306

回答

0

我假設你有一個名爲user_id的列。那麼你應該可以做到以下幾點:

public function photos() 
{ 
    return $this->belongsToMany('Photo')->select(['id', 'user_id', 'date', 'name']); 
} 

你必須選擇外鍵,否則它將無法加入它。

+0

我試過這個,但它仍然會選擇其他列... – tiffanyhwang

+0

固定'belongsToMany('照片')'。 'photo_user'表有'photo_id'和'user_id'字段。 – tiffanyhwang

+0

嘗試使用get方法而不是select。它是否會拋出異常? – jah

1

如果您的應用程序的需求發生變化,指定您想要的關於Photos關係的確切列可能最終會讓您在將來陷入困境。更好的解決方案是僅指定要返回的數據,即特定實例,即您要傳遞的特定JSON響應。

選項1:擴展/覆蓋toArray() Eloquent函數(由toJson()調用)並更改其返回的信息。儘管如此,這將影響每調用這些方法,所以最終可能會給您帶來與原始查詢中的select()相同的問題。

選項2:爲您的JSON響應創建特定的方法,並將其稱爲它,而不是一般的toJson()。然後,該方法可以進行必要的任何數據構建/數組修改,以實現您所需的特定輸出。選項3:如果您正在使用通常需要特定格式的API或ajax調用,請考慮使用像League/Fractal這樣的庫,該庫專爲此類場合而構建。 (菲爾也在製作book on building APIs,但它並不吸引。)

0

您可以使用belongsToMany和select操作使用laravel關係。

public function photos() 
{ 
    return $this->belongsToMany('Photo')->select(array('name', 'date')); 
}