使用带有Laravel的DataTables时参数号错误无效

时间:2015-01-22 18:08:50

标签: mysql laravel-4 datatables

当DataTables尝试获取数据时,它总是会在这个Eloquent查询中被绊倒:

$items = Item::select([
        DB::raw("images.url AS image"),
        'items.id',
        'items.sku',
        'items.quantity',
        DB::raw("IF(items.enabled, 'Yes', 'No') AS enabled")
    ])
        ->leftJoin('images', function ($j) {
            $j->on('images.imageable_id', '=', 'items.id')
                ->where('images.imageable_type', '=', 'Item');
        })
        ->leftJoin('order_items', 'items.id', '=', 'order_items.item_id')
        ->leftJoin('orders', 'orders.id', '=', 'order_items.order_id')
        ->where('items.store_id', 1)
        ->whereNull('items.deleted_at')
        ->whereIn('items.status', ['active', 'submitted'])
        ->groupBy('items.id');

查询工作正常,并返回所需的结果。但是,DataTables尝试将其转换为产生错误的以下内容:

select count(*) as aggregate from (select '1' as row from `items` left join `images` on `images`.`imageable_id` = `items`.`id` and `images`.`imageable_type` = 1 left join `order_items` on `items`.`id` = `order_items`.`item_id` left join `orders` on `orders`.`id` = `order_items`.`order_id` where `items`.`store_id` = 1 and `items`.`deleted_at` is null group by `items`.`id`) AS count_row_table

这特别产生了这个错误:

SQLSTATE[HY093]: Invalid parameter number
/home/vagrant/Projects/test.dev/vendor/laravel/framework/src/Illuminate/Database/Connection.php#301

当我直接在MySQL数据库上执行该查询时,它没有问题。这似乎只发生在Laravel内。

如果删除查询的->leftJoin('images', function ($j) {...}部分,则没有错误,但我需要为图像加入。

如何解决此错误?

通过AJAX将完整错误输出返回到DataTables:

{  
   "error":{  
      "type":"Illuminate\\Database\\QueryException",
      "message":"SQLSTATE[HY093]: Invalid parameter number (SQL: select count(*) as aggregate from (select '1' as row from `items` left join `images` on `images`.`imageable_id` = `items`.`id` and `images`.`imageable_type` = 1 left join `order_items` on `items`.`id` = `order_items`.`item_id` left join `orders` on `orders`.`id` = `order_items`.`order_id` where `items`.`store_id` = active and `items`.`deleted_at` is null and `items`.`status` in (submitted, ?) group by `items`.`id`) AS count_row_table)",
      "file":"\/home\/vagrant\/Projects\/test.dev\/vendor\/laravel\/framework\/src\/Illuminate\/Database\/Connection.php",
      "line":625
   }
}

2 个答案:

答案 0 :(得分:1)

我今天遇到过类似的问题,不是使用DataTables,而是使用独立查询构建器构建复杂查询。问题类似于你的左连接,传递一个闭包来构建一个更复杂的连接条件。 " on"后我正在使用where条件。

解决方案是连接" on"调用:

->leftJoin('images', function ($j) {
        $j->on('images.imageable_id', '=', 'items.id')
            // note the "on" rather than the "where" and the use of a raw statement
            ->on('images.imageable_type', '=', DB::raw('Item'));
    })

答案 1 :(得分:0)

我有这个问题。解决方法并不完美,因为它基本上会抓取所有数据两次,但这是我能让它工作的唯一方法。

在将->get();发送给->make();之前,您必须先执行$data = DB::table('some_table'); $data->leftJoin('some_other_table', function($join) { $join->on('some_table.id', '=', 'some_other_table.id') ->where('some_table.something', '=', 'some_value'); }); $data->get(); return Datatables::of($data)->make(); 。老实说,我希望有人找到合适的解决方案但是现在:

临时解决方案:

{{1}}

这是使用Laravel的数据表包:https://github.com/bllim/laravel4-datatables-package