php - 具有多个 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 > final_weight或
- current_cbm > current_weight和
- finals_sent 不为空
而上面的条目不适合这个,因为 current_weight 和 current_cbm 显然不高于 final_weight 和 final_cbm。
我究竟做错了什么?
解决方案
啊,好的,问题来了。为了比较您必须使用的两列,whereRaw()
因为where
第二个参数需要一个值,而不是一列。所以这应该可行,我用你的数据库和值进行了测试。
return $query->whereNotNull('finals_sent')->where(function ($q) {
$q->whereRaw('current_weight > final_weight')
->orWhereRaw('current_cbm > final_cbm');
});
推荐阅读
- c++ - CGAL - 如何使用 CGAL::Polygon_mesh_processing::connected_components 将一个 CGAL::Surface_mesh 转换为多个?
- ecmascript-6 - 我应该使用什么类型在 jsdoc 中记录 ES6 模块参数?
- java - 我需要从 Farm 类的 Employee 类中获取最大值
- vb.net - 从列表框中列出的文本文件中删除行
- android - 即使在 Play 商店中关闭自动更新,如何让我的应用更新?
- php - 使用准备好的语句进行全文搜索返回空数组
- javascript - ajax 无法将请求发送到另一个 php 页面
- python - 如何裁剪轮廓?
- python - GSSException:尝试使用 kerberos 票证进行身份验证时未找到以下凭据:1.2.840.113554.1.2.2
- jquery - Axaj 呼叫而不重新加载页面?