【发布时间】: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(。就查询而言,它可能没有什么区别,但它确实避免了两次将其作为原始数据传递。