gpt4 book ai didi

php - Laravel 5.8 Eloquent 无法按预期工作,尽管它的原始转储查询有效

转载 作者:行者123 更新时间:2023-11-29 09:37:47 24 4
gpt4 key购买 nike

我遇到了 Eloquent 查询与使用原始查询不同的问题,尽管当我使用 toSql() 转储它时它返回完全相同的原始查询

这应该返回 3 行,但实际上返回 40 行

$equipment = Equipment::where(["class_id" => $this->classId, "class_id2" => $this->classId, "class_id3" => $this->classId])
->orWhere(["class_id" => 0, "class_id2" => 0, "class_id3" => 0])
->where("type_id", ">", "7")
->get();

这将返回 3 并按预期工作

$equipment = \DB::table("equipment")
->whereRaw("(`class_id` = ".$this->classId." and `class_id2` = ".$this->classId." and `class_id3` = ".$this->classId.")
or (`class_id` = ".$this->classId." or `class_id2` = ".$this->classId." or `class_id3` = ".$this->classId.")
and `type_id` > 7")
->get();

Eloquent 转储的确切原始查询是这样的:

select * 
from `equipment`
where (`class_id` = 14 and `class_id2` = 14 and `class_id3` = 14)
or (`class_id` = 14 or `class_id2` = 14 or `class_id3` = 14)
and `type_id` > 7

在 Navicat 中运行此命令时,它还会返回 3 行。

我在这里缺少什么?

最佳答案

您应该更明确地了解您的条件组,可以通过使用匿名函数作为第一个 where() 的参数(参数为 $query<)来实现这一点 (这将是 querybuilder 对象本身)。

$classID = 14;
$equipment = Equipment::where(function($query) use ($classID) {
$query->where('class_id', $classID)
->orWhere('class_id2', $classID)
->orWhere('class_id3', $classID);
})->where("type_id", ">", "7")
->get();

您当前的查询没有多大意义,因为当 AND 条件成立时,OR 条件始终为真,因此我们可以删除第一个的一部分,从而简化查询。

您可以使用 toSql() 而不是 get() 来调试查询,后者将打印最终的 SQL 字符串。如果您在这里这样做,您会看到条件变成类似 WHERE .. OR .. AND ..,而不是 WHERE (.. OR ..) AND ...

关于php - Laravel 5.8 Eloquent 无法按预期工作,尽管它的原始转储查询有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57235487/

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