2015-02-09 21 views
0

Model excerpt清單用戶的產品按類別雄辯

基本上我有以下表和我試圖列出給定用戶自己的所有產品按類別。

例子:

{ 
user_id: 1 
username: xpto 
    categories: [{ 
     id: 1 
     name: category_1 
     products: [{ 
      id: 3 
      name: prod1 
     }, 
     { 
      id: 3 
      name: prod1 
     }], 
     id: 2 
     name: category_2 
     products: [{ 
      id: 6 
      name: prod5 
     }], 
    }] 
} 

我從我所期望的結果得到的最接近是與此查詢: App\User::with('products.category')->find(1);

已經花了很多時間思考這一點,但沒有任何線索,開始感到絕望。請幫助。

+0

究竟是不是工作?您提供的查詢(App \ User)是否返回數據? – Dave 2015-02-09 21:28:35

+0

@Dave它返回數據,但不是我想要的數據(以我想要的格式)。所以基本上我不知道如何編寫查詢。 – 2015-02-09 21:33:00

回答

0

Eloquent不會使用帶連接的單個查詢來返回數據,因此當您需要篩選相關表時,使其成爲糟糕的選擇。您雄辯的電話:

App\User::with('products.category')->find(1); 

...實際上執行幾個查詢。

SELECT * FROM users WHERE id = 1 

SELECT * FROM products JOIN product_user ... WHERE user_id = 1 

SELECT * FROM categories WHERE id IN (...all of the category_ids returned from products...) 

您應該立即看到問題:首先雄辯查詢所有用戶,並將其存儲在一個數組,然後使用單獨的查詢來獲取產品和類別。因此,您無法按類別對用戶進行排序。

有兩種方法來解決這個:

  1. 用雄辯來獲取產品和類別(如你所提供的例子)的用戶,然後遍歷結果並拉出(和排序)的類別和產品。
  2. 使用連接構造適當的查詢。

    User::select('users.name as user_name', 'products.name as product_name', 'categories.name as category_name') 
         ->join('product_user', 'users.id', '=', 'product_user.user_id') 
         ->join('products', 'product_user.product_id', '=', 'products.id') 
         ->join('categories', 'products.category_id', '=', 'categories.id') 
         ->orderBy('categories.name') 
         ->get(); 
    

注意,您需要指定列的別名,如果你的表共享一樣的id,name列名等

+0

感謝您的洞察力。將工作在你的例子,以獲得我在找什麼(相當接近壽):) – 2015-02-09 22:32:57