2

我正在努力使用查询生成器在我的表之间创建内部连接。我有三个具有以下关系的表:

飞机类别 1:m 飞机类型 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'));

但是,这将返回同一品牌的多个实例。我正在努力在表之间创建一个内部连接,以便一个品牌只返回一次。

我哪里错了?

4

1 回答 1

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 Query Builder 代码可能看起来像

$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();

的样本输出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"
  }
}
于 2013-07-23T05:15:21.780 回答