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

Laravel中DB::select报错:prepareBindings()需传入数组却收到null

问题排查与解决方案

我来帮你一步步排查这个Laravel中SQL执行失败的问题:

核心错误原因分析

你遇到的Argument 1 passed to Illuminate\Database\Connection::prepareBindings() must be of the type array, null given错误,表面看是绑定参数的问题,但结合你的SQL语句来看,主要根源是SQL中的引号语法错误,间接引发了参数绑定的异常;同时也要确认绑定参数的有效性。


1. 先修正SQL中的引号问题

你的SQL里用了"这种HTML转义字符,这在PHP字符串中会被当成普通文本传递给数据库,导致数据库无法识别正确的字符串分隔符,直接引发SQL语法错误。

把所有"替换成单引号'即可,修正后的完整代码如下:

$order_items = DB::select("
    SELECT 
        i.`id`,
        i.`chef_id`,
        i.`selected_date_type`,
        i.`delivery_date`, 
        REPLACE(REPLACE(TRIM(g.items), ' ', ' '), ' ', ', ') AS collection_items,
        CONCAT(chef_address.latitude, ' , ', chef_address.longitude) AS source_address,
        CONCAT(customer_address.latitude, ' , ', customer_address.longitude) AS destination_address 
    FROM order_item i 
    INNER JOIN ( 
        SELECT 
            `delivery_date`,
            `selected_date_type`,
            `chef_id`,
            `order_id`, 
            GROUP_CONCAT(`id` SEPARATOR ' ') AS items 
        FROM order_item 
        GROUP BY `delivery_date`, `selected_date_type`, `chef_id`,`order_id` 
    ) g ON g.`delivery_date` = i.`delivery_date` 
        AND g.`selected_date_type` = i.`selected_date_type` 
        AND g.`chef_id` = i.`chef_id` 
        AND g.`order_id`= i.`order_id` 
    INNER JOIN `orders` on `orders`.`id` = i.`order_id` 
    INNER JOIN `user_address` as `customer_address` on `customer_address`.`id` = `orders`.`address_id` 
    INNER JOIN `user_address` as `chef_address` on `chef_address`.`user_id` = i.`chef_id` 
    WHERE i.`order_id` = ?
", [$orderCart->id]);

2. 验证绑定参数的有效性

虽然你说SQL在数据库中能运行,但还是要确认$orderCart->id是否为有效非空值:

  • 可以在执行SQL前先打印参数,排查是否为null:
    dd($orderCart->id); // 确认输出是有效数值而非null
    
  • 如果$orderCart本身可能为null,建议先做存在性检查:
    if (!$orderCart || is_null($orderCart->id)) {
        throw new \Exception("无效的购物车订单");
    }
    

3. 额外调试技巧

如果还是有问题,可以手动拼接完整SQL在数据库中测试,确认语法绝对正确:

$sql = "SELECT ... WHERE i.`order_id` = ?"; // 替换成你的完整SQL
$bindings = [$orderCart->id];
$testSql = str_replace('?', $bindings[0], $sql);
dd($testSql); // 复制输出的SQL到数据库客户端执行,排查语法问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:11:10