You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel中DB查询where子句变量传递失效问题排查

如何正确传递动态查询条件到Laravel的where子句?

你的问题出在把查询运算符和值拼成了字符串变量,而Laravel的where数组条件需要的是独立的运算符和值参数,不是拼接后的字符串。

为什么原来的写法会失效?

你当前把$direction赋值成了类似"'LIKE', '%'"的字符串,当你把它传入where数组的['carrierOrigin', $direction]时,Laravel会把这个字符串当成运算符来处理,最终生成的SQL会变成:

WHERE carrierOrigin = '\'LIKE\', \'%\' '

这显然和你预期的carrierOrigin LIKE '%'完全不符,自然查不到任何结果。

正确的解决方法

有两种简洁的方式来修复这个问题:

方法1:让$direction存储运算符和值的数组

修改你的变量赋值逻辑,直接把运算符和值放到数组里:

if(empty($_GET['direction'])){
    $direction = ['LIKE', '%'];
} else if ($_GET['direction'] === 'Inbound') {
    $direction = ['>', 1];
} else if ($_GET['direction'] === 'Outbound'){
    $direction = ['=', 1];
}

然后在where子句里,把字段名和这个数组合并成完整的条件:

$manifests = DB::table('carrier_manifests')
    ->join('customers', 'carrier_manifests.carrierOrigin', '=', 'customers.id')
    ->select('carrier_manifests.*', 'customers.customer_name')
    ->where([
        ['manifestNumber', 'LIKE', '%' . $manifest . '%'],
        ['originTerminal','LIKE','%' . $terminal . '%'],
        // 合并字段名和$direction数组,形成完整的三元条件
        array_merge(['carrierOrigin'], $direction),
    ])
    ->orderBy('dateUnloaded', 'DESC')
    ->whereBetween('dateUnloaded', [$startDate, $endDate])
    ->limit(100)
    ->get();

方法2:分开定义运算符和值变量

如果你觉得数组的方式不够直观,也可以拆分出两个独立变量:

// 初始化默认值
$dirOperator = 'LIKE';
$dirValue = '%';

if ($_GET['direction'] === 'Inbound') {
    $dirOperator = '>';
    $dirValue = 1;
} else if ($_GET['direction'] === 'Outbound'){
    $dirOperator = '=';
    $dirValue = 1;
}

然后直接在where条件里使用这两个变量:

$manifests = DB::table('carrier_manifests')
    ->join('customers', 'carrier_manifests.carrierOrigin', '=', 'customers.id')
    ->select('carrier_manifests.*', 'customers.customer_name')
    ->where([
        ['manifestNumber', 'LIKE', '%' . $manifest . '%'],
        ['originTerminal','LIKE','%' . $terminal . '%'],
        ['carrierOrigin', $dirOperator, $dirValue],
    ])
    ->orderBy('dateUnloaded', 'DESC')
    ->whereBetween('dateUnloaded', [$startDate, $endDate])
    ->limit(100)
    ->get();

两种方法都能让Laravel生成正确的SQL条件,你可以根据自己的习惯选择。

内容的提问来源于stack exchange,提问作者Matthew

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:38:40