【问题标题】:Issues with Joins in Eloquent ORM and LaravelEloquent ORM 和 Laravel 中的连接问题
【发布时间】:2013-07-21 23:13:36
【问题描述】:

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

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'));

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

我哪里错了?

【问题讨论】:

    标签: php join laravel eloquent


    【解决方案1】:

    恕我直言,您的问题与 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"
      }
    }
    

    【讨论】:

    • 奇怪的是,我也在使用品牌表。我需要将响应输出为 JSON 对象以读入 Angular JS,并且能够使其像这样工作:return Response::json(array('brands' => $brands));
    猜你喜欢
    • 2018-08-07
    • 2013-06-02
    • 2015-08-13
    • 1970-01-01
    • 2014-10-18
    • 1970-01-01
    • 2014-08-19
    • 2019-05-21
    • 2019-04-20
    相关资源
    最近更新 更多