在条件为'wherenotin'的情况下连接两个表会在laravel中返回错误的行

pkwftd7m  于 2021-06-18  发布在  Mysql
关注(0)|答案(3)|浏览(367)

我有两张table:
表a有以下列:

id - rule_id - car_id

100 - 3 - 5

101 - 4 - 5

102 - 2 - 6

103 - 3 - 6

表\u b有更多的列,但这里需要的是:

id - car_id

70 - 5

71 - 6

我想把这两张table合起来。我的代码如下:

$ruleIds = [1,2,3]; // Got from user: User wants to see cars that are not included in those(1,2,3) rules.
$cars = Car::where('type', $type);
$result = $cars->join('rule', 'rule.car_id', 'car.car_id')
    ->whereNotIn('rule.rule_id', $ruleIds);

但mysql的作用如下:
连接上的两个表 rule.car_id 以及 car.car_id 检查哪里 rule.rule_id != 1 , rule.rule_id != 2 , rule.rule_id != 3 .
但是,对于车号为6的车辆,它会在我申报时返回记录 whereNotIn('rule.rule_id', [1,2,3]) . 它对自己说,car\u id为6没有rule\u id为2,但是rule\u id为3的第二辆车不等于2,所以它再次返回记录。
如果其中一个条件 whereNotIn 条件不一定都匹配吗?
例如:如果我(作为用户)为规则设置了1,2,它不应该从cars表中返回car\ id为6的car,因为在rules表中,我们有一个规则,它的rule\ id是2(规则i(用户)集之一)。
因此,如果1..如果2..如果3..如果1,2,3,4..如果1,2,3,4..如果3..如果1,2,3,4..如果3..如果1,2,3,4..如果3..如果1,2,3,4..如果1,3,4..如果3
关于“编辑您的问题并根据规则显示示例输出\u id=(1,2)。将其显示为表格,而不是难以辨认的文本。“我希望返回值为:
数组()

lvjbypge

lvjbypge1#

我可以在@timbiegeleisen的帮助下解决这个问题,答案是:

$paramValues = explode(',', $data['rules']);
$paramKeys = '';
for($p=1; $p<=$paramCount; $p++)
{
    $paramKeys .= '?,';
}
$paramKeys = rtrim($paramKeys, ',');

$cars->join('rule', 'rule.car_id', 'cars.car_id')
    ->whereRaw("cars.car_id NOT IN (SELECT car_id FROM rule WHERE rule_id IN (".$paramKeys."))", $paramValues)
    ->groupBy('cars.car_id');

很抱歉英语不好或解释不好:)
为了防止sql注入,我为循环做了那个。有没有其他更好的方法?
在查询中有另一个select,但我只想用join和simple来实现。有没有其他方法可以得到这个?
谢谢大家:)

gzszwxb4

gzszwxb42#

您的原始mysql查询可能是这样的:

SELECT *
FROM TABLE_A a
INNER JOIN TABLE_B b
    ON a.car_id = b.car_id
WHERE
     NOT EXISTS (SELECT 1 FROM TABLE_A a2
                 WHERE a.car_id = a2.car_id AND a2.rule_id IN (1, 2));

拉威尔代码:

$cars = Car::where('type', $type);
$result = $cars->join('rule', 'rule.car_id', 'car.car_id')
    ->where(DB::raw("NOT EXISTS (SELECT 1 FROM rule r2
                 WHERE rule.car_id = r2.car_id AND r2.rule_id IN (1, 2))"));

请注意,我没有试图 rule_id 要动态筛选的值。也就是说,我不约束你 $ruleIds 查询的数组。其原因是,对于未知数量的规则,很难做到这一点。但是,上面的代码应该会让你走上正确的轨道。

1cklez4t

1cklez4t3#

$posts = App\Car::whereHas('rules', function ($query)use($ruleIds) {
    $query->whereNotIn('rule_id',  $ruleIds);
})->get();

相关问题