【问题标题】:Datatable Search return Sql Excelption数据表搜索返回 Sql 异常
【发布时间】:2021-07-05 19:43:17
【问题描述】:

当表第一次加载时,它会正常加载,但如果我在搜索框中输入一些内容,我会收到 SQL 异常,这是我的代码:

public function getProducts(Request $request)
{

    $data = Product::
            select(['products.id',
                    'products.name',
                    'products.price',
                    'products.cost',
                    'products.is_group as pack',
                    'products.created_at',
                     DB::raw("(select path from product_images where product_id =products.id and CASE WHEN path IS NULL THEN  'productImages/no-image.png' else path  END) as path")
            ]);
    if ($request->wirehouse)
    { 
        $wirehouse = $request->wirehouse;
        $data->selectRaw(DB::raw('(select if(sum(stocks.qte) > 0 , sum(stocks.qte) , 0) from stocks
                                   where stocks.product_id = products.id and
                                   stocks.wirehouse_id = ' . $wirehouse . ')
                                   - (select if(sum(stocks.qte) > 0 , sum(stocks.qte) , 0)
                                   from stocks where stocks.product_id = products.id and stocks.stock_id
                                   in (select stocks.id from stocks where stocks.product_id = products.id
                                   and stocks.wirehouse_id = ' . $wirehouse . ') ) as total_stock ,
                                   (select if(sum(items.quantity) > 0 , sum(items.quantity) , 0) from orders,
                                   items where orders.id = items.order_id and items.product_id = products.id
                                   and (orders.status in (4,5,6,9,11) or (orders.status = 8 and orders.recover = 0))
                                   and items.wirehouse_id = ' . $wirehouse . ') as out_stock'));
        $data->havingRaw('total_stock - out_stock != 0');
  
    }
    else
    {
        $data->selectRaw(DB::raw('(select if(sum(stocks.qte) > 0 , sum(stocks.qte) , 0) from stocks where stocks.product_id = products.id and stocks.stock_id = 0  and stocks.confirm = 1) as total_stock '));

        $data->selectRaw(DB::raw('(select if(sum(items.quantity) > 0 , sum(items.quantity) , 0) from orders,
                                   items where orders.id = items.order_id and items.product_id = products.id
                                   and (orders.status in (4,5,6,9,11) or (orders.status = 8 and 
                                   orders.recover = 0))) as out_stock'));                           
                                 
        $data->selectRaw(DB::raw('(select ifnull( sum(items.quantity*groups.qte) , 0) from orders
                                   JOIN items on items.order_id=orders.id join `groups` on
                                   groups.main = items.product_id where orders.id = items.order_id 
                                   and groups.product_id=products.id and (orders.status in (4,5,6,9,11) or
                                   (orders.status = 8 and orders.recover = 0))) as grp '));
    }
    $data->orderBy(DB::raw('total_stock - out_stock + grp') , "Desc");

    return DataTables::of($data)->make(true);
}

这是我搜索时遇到的异常:

SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本对应的手册,以在第 12 行的 '.product_id = products.id and stocks.`stock_id = 0 和' 附近使用正确的语法

我使用 Laravel 8 和 MySQL 8.0.21

【问题讨论】:

  • 它似乎在你的原始语句中添加了勾号,但我不知道为什么。不过,您不需要在选择和选择内部都使用 raw。只有一个人会做
  • @aynber 你能给我一个例子吗?
  • 错误显示'.`product_id = products`.`id and stocks`.`stock_id = 0 and 请注意,反引号` 放置不正确。那是错误,但这似乎不是您在代码中向我们展示的内容。 你确定这是错误来自的代码
  • @RiggsFolly 是的,我确定并且我认为过滤发生在 DataTables 函数中
  • selectRaw(DB::raw( 你传入 raw 两次。仅使用selectRaw(select(DB::raw(。就查询而言,它可能没有什么区别,但它确实避免了两次将其作为原始数据传递。

标签: php mysql laravel


【解决方案1】:

感谢大家的回答,我通过将DataTables::of($data)->make(true); 更改为手动过滤记录解决了我的问题:

DataTables::eloquent($data)
        ->filter(function ($query) {
            $num=is_numeric(request()->search['value']);
            if (request()->search['value']!=null && !$num) {
                $query->where('products.name','like', "%" . request()->search['value'] . "%");
            }else {
                $query->where('products.price','like', "%" . request()->search['value'] . "%");
                $query->Orwhere('products.cost','like', "%" . request()->search['value'] . "%");
            }
        }, false)
        ->toJson();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-31
    • 1970-01-01
    • 2020-01-26
    • 1970-01-01
    • 2010-11-13
    • 2013-06-13
    相关资源
    最近更新 更多