首页 > 解决方案 > 具有多个 where 子句的 Laravel 查询范围返回不正确的数据

问题描述

我有下表consols

Schema::create('consols', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->double('current_weight', 8, 3)->default(0);
    $table->double('current_weight', 8, 3)->default(0);
    $table->double('final_weight', 8, 3)->default(0);
    $table->double('final_cbm', 8, 3)->default(0);    
    $table->timestamp('finals_sent', 0)->nullable();
});

其中包含如下条目:

id | current_weight | current_cbm | final_weight | final_cbm | finals_sent         |
-----------------------------------------------------------------------------------|
1  | 45.000         | 1.000       | 200.000      | 10.000    | 2019-09-26 10:03:59 |

我在我的模型上写了一个范围Consol来过滤条目,其中:finals_sent不为空,current_weight > final_weight或者current_cbm > final_cbm

public function scopeOfCurrentGreaterThanFinals($query)
{
    return $query->whereNotNull('finals_sent')->where(function ($query) {
        $query->where('current_weight', '>', 'final_weight')
            ->orWhere('current_cbm', '>', 'final_cbm');
    });

}

当我使用它并将其转储时 - 我希望看不到任何结果:

$consols = Consol::ofCurrentGreaterThanFinals()
           ->orderBy('awb', 'DESC')
           ->get()
           ->toArray();

但是,仍然显示上面的条目:

array:1 [▼
  0 => array:24 [▼
    "id" => 1
    "current_weight" => 45.0
    "current_cbm" => 1.0
    "final_weight" => 200.0
    "final_cbm" => 10.0
    "finals_sent" => "2019-09-26 10:03:59"
  ]
]

我不确定我做错了什么?我想我清楚地说我只想看到结果,其中:

而上面的条目不适合这个,因为 current_weight 和 current_cbm 显然不高于 final_weight 和 final_cbm。

我究竟做错了什么?

标签: phplaravellaravel-6

解决方案


啊,好的,问题来了。为了比较您必须使用的两列,whereRaw()因为where第二个参数需要一个值,而不是一列。所以这应该可行,我用你的数据库和值进行了测试。

return $query->whereNotNull('finals_sent')->where(function ($q) {
            $q->whereRaw('current_weight > final_weight')
                ->orWhereRaw('current_cbm > final_cbm');
        });

推荐阅读