2014-10-28 48 views
0

我有以下查詢我想執行EloquentLaravel限制(不全球)

$restaurant = Restaurant::with([ 
    'user' => function($query) 
    { 
     $query->select(['username']); // This doesn't work 
     $query->whereStatus('confirmed'); 
    } 
])->find($id); 

我想要提取Restaurant和它對應User(它們是相關的),但是從User我不wan't的所有信息。在這種情況下只有username

我可以爲User模型添加屬性$hidden,但對於每個查詢(以array/json形式),它們都將隱藏。但我只想限制一下這個查詢。

如果我添加的選擇(帶或不帶陣列中的包裝吧)我得到以下結果:

{ 
    'id': 1, 
    'user': null 
} 

然而,如果我刪除選擇,我得到了充分User

{ 
    'id': 1, 
    'user': { .. json user data } 
} 

User確實存在,並且username不爲空。我怎麼去解決這個問題?

這裏可以找到actual輸出。

編輯:當我將select中的值更改爲數據庫中不存在的內容時,我看到一個錯誤,並從中推斷出Query是正確的,但我沒有得到任何輸出。 (使用無效列「測試」時得到的查詢)。

select `test` from `users` where `users`.`deleted_at` is null and `users`.`userable_id` in (1) and `users`.`userable_type` = Restaurant and `status` = confirmed) 
+0

**關係的主鍵和外鍵**:再一次:http://stackoverflow.com/questions/25906790/getting-specific-columns-with-eager-loading-laravel-4/25907624#25907624 - upvote和玩得開心。 – 2014-10-28 18:36:02

回答

1

試試這個方法:

$restaurant = Restaurant::with([ 
    'user' => function($query) 
    { 
     $query->whereStatus('confirmed')->lists('username'); 
    } 
])->find($id); 

編輯

看來,這兩種方法將工作,但您需要滿足一個條件 - 你需要在列表foreign_key列/選擇。我不知道你是什麼關係,但是,例如假設你有usersrestaurant_id列,您需要使用下面的代碼:

$restaurant = Restaurant::with([ 
    'user' => function($query) 
    { 
     $query->select(['username', 'restaurant_id'])->whereStatus('confirmed'); 
    } 
])->find($id); 

$restaurant = Restaurant::with([ 
    'user' => function($query) 
    { 
     $query->whereStatus('confirmed')->lists('username','restaurant_id'); 
    } 
])->find($id); 

我不知道n:n關係是可能的。你還應該考慮這可能有點危險(可能會發生一些問題),所以只有當你有足夠的理由才能抓住選定的列時,你才應該使用它。

+0

它似乎沒有區別。 (在TS中添加了我的回覆的Json要點)。 – Matthijn 2014-10-28 18:05:54

+0

@Matthijn我已經更新了我的答案 – 2014-10-28 18:36:10

+0

真棒,似乎做的伎倆,是有道理的。 – Matthijn 2014-10-28 18:39:25