Laravel Eloquent 查询 buldier 的错误

问题描述 投票:0回答:1

在查询中嵌套带有 orWhereNull 的 where 时,我发现了一个奇怪的情况。 结果是返回值既不为空也不正确的行

这是代码:

$query = Document::where("active", true)->where("type_id", $document_type->id);
if($selected) {
    $query->where(function($q) use($selected) {
        return $q->where("origen_id", $selected->id)
            ->orWhereNull("origen_id");
    });
}
$result = $query->orderBy("origen_id")->get();

debuggin 时,$query->toSql() 返回:

select * from 
文档
where
活动
= ? and
type_id
 = ? and (
origen_id
= ? or
origen_id
 is null)

wheres 的值是正确的: 在哪里1 哪里2

当我运行此查询时,它仅返回一个结果,但 $query->get() 返回 2 个结果,其中之一,其 origen_id 与 $selected->id 不同(且不为空)

这是一件非常奇怪的事情,我不知道如何获得预期的结果,因为生成的查询是好的

laravel eloquent laravel-8
1个回答
0
投票

您在生成的 SQL 查询中遇到的问题似乎与 SQL 字符串中缺少空格有关。如果 Laravel 中构建查询的方式存在问题,就会发生这种情况。

这是更正后的代码片段:

$query = Document::where("active", true)->where("type_id", $document_type->id);


if($selected) {
$query->where(function($q) use($selected) {
    $q->where("origen_id", $selected->id)
      ->orWhereNull("origen_id");
});}

$result = $query->orderBy("origen_id")->get();
// Debugging

dd($query->toSql(), $query->getBindings());

© www.soinside.com 2019 - 2024. All rights reserved.