2013-07-23 19 views
2

我很努力地使用查詢生成器在我的表之間創建內部連接。我有三個表具有下列關係:在雄辯的ORM和Laravel中加入的問題

aircraft_classes 1:M aircraft_types M:1個品牌

我試圖構建地方給出飛機類的查詢,我可以檢索的品牌名單。下面的SQL查詢工作正常:

SELECT * FROM brands 
INNER JOIN aircraft_types ON brands.id = aircraft_types.brand_id 
INNER JOIN aircraft_classes ON aircraft_types.aircraft_class_id = aircraft_classes.id 
WHERE aircraftClassID = $class 

我目前有:

$brands = DB::table('brands') 
->join('aircraft_types', 'brands.id', '=', 'aircraft_types.brand_id') 
->join('aircraft_classes', 'aircraft_types.aircraft_class_id', '=', 'aircraft_classes.id') 
->where('aircraft_classes.id', '=', $class) 
->get(array('brands.id', 'brands.brand_name')); 

然而,這將返回同一品牌的多個實例。我努力在表格之間創建一個內部連接,以便品牌只返回一次。

我哪裏錯了?

回答

5

恕我直言,你的問題與Laravel無關,因爲你的基本SQL查詢不正確。因爲它是您的查詢多次抓取品牌信息(如JOIN所述),如果您有多個相同品牌的飛機類型。

  1. 所有你不需要用aircraft_classes加入,因爲你是在過濾aircraft_classes_id
  2. 其次獲得的品牌不同的列表中,您可以選擇使用DISTINCTGROUP BY

首先你SQL查詢可能是這樣的

SELECT id, brand_name 
    FROM brands 
WHERE id IN 
(
    SELECT DISTINCT brand_id 
    FROM aircraft_types 
    WHERE aircraft_class_id = 1 
); 

SELECT b.id, b.brand_name 
    FROM aircraft_types t JOIN brands b 
    ON t.brand_id = b.id 
WHERE aircraft_class_id = 1 
GROUP BY b.id, b.brand_name; 

這裏是SQLFiddle演示

現在你Laravel查詢生成器代碼可能看起來像var_dump($brands);

array(2) { 
    [0]=> 
    object(stdClass)#133 (2) { 
    ["id"]=> 
    int(1) 
    ["brand_name"]=> 
    string(6) "Brand1" 
    } 
    [1]=> 
    object(stdClass)#134 (2) { 
    ["id"]=> 
    int(2) 
    ["brand_name"]=> 
    string(6) "Brand2" 
    } 
} 
+0

$brands = DB::table('aircraft_types AS t') ->join('brands AS b', 't.brand_id', '=', 'b.id') ->where('t.aircraft_class_id', '=', 1) ->groupBy('b.id', 'b.brand_name') ->select('b.id', 'b.brand_name') ->get(); 

示例輸出奇怪的是,我用工作品牌表也是如此。我需要輸出響應作爲JSON對象讀入Angular JS,並能夠使其工作,如下所示:return Response :: json(array('brands'=> $ brands)); – Jazzy