gpt4 book ai didi

php - Eloquent ORM 和 Laravel 中的连接问题

转载 作者:行者123 更新时间:2023-12-02 21:56:06 25 4
gpt4 key购买 nike

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

飞机类别 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'));

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

我哪里出错了?

最佳答案

恕我直言,您的问题与 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 查询生成器代码可能如下所示

$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"
}
}

关于php - Eloquent ORM 和 Laravel 中的连接问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17800786/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com