我正在尝试使用Laravel查询生成器运行此查询。我认为查询是正确的,因为当我在MySQL工作台中运行查询时,查询会执行,并得到预期的结果。我知道我们可以使用laravel query builder编写原始查询,但它存在SQL注入漏洞。所以我试着不带任何疑问地继续下去。
这就是问题所在
SELECT invoice.InvNo,customer.RouteCode,customer.CustomerCode,rootplan_product.RouteplanCode,invoice.Status
FROM rootplan_product
INNER JOIN
customer ON customer.RouteCode = rootplan_product.RouteCode
AND
customer.CustomerCode = rootplan_product.customercode
INNER JOIN
invoice ON invoice.CustomerCode = customer.CustomerCode
WHERE
rootplan_product.RouteCode='MO-A' AND invoice.Status IN ('PENDING','ACTIVE')
ORDER BY invoice.Status desc
我已经使每个表一个模型和使用在控制器像这样。因为表名不同于命名约定。我添加了protected$table='correct_table_name';
在每个模型中。
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use \App\Route;
use \App\Customer;
use \App\Invoice;
use \App\Rootplan_Product;
这是控制器功能
public function retrieveRouteCodeData(Request $request){
try {
$RouteCode = $request->RouteCode;
$retrievedData = DB::table('rootplan_product')
->join('customer', function($join){
$join->on('customer.RouteCode', '=', 'rootplan_product.RouteCode');
$join->on(DB::raw('(customer.CustomerCode = rootplan_product.CustomerCode)'));
})
->join('invoice', 'invoice.CustomerCode', '=', 'customer.CustomerCode')
->select('invoice.InvNo', 'customer.RouteCode', 'customer.CustomerCode', 'rootplan_product.RouteplanCode', 'invoice.Status')
->where('rootplan_product.RouteCode', $RouteCode)
->orderBy('invoice.Status','desc')
->get();
return response()->json(['msg'=>'Updated Successfully', 'result'=>$retrievedData, 'success'=>true]);
}
catch (\Exception $e) {
return response()->json(['msg'=>$e->getMessage()]);
}
}
在控制台中,我得到了这个错误
“SQLSTATE[42S22]:未找到列:“on子句”中的1054未知列”(SQL:选择invoice
,InvNo
,customer
,customer
,rootplan\u product
,rootplan\u product
,invoice
状态来自rootplan\u product
内部连接客户
,uteCode
=rootplan\u产品
<代码>路线代码和(customer.CustomerCode=rootplan\u product.CustomerCode)=``内部连接发票
打开发票
<代码>客户代码=客户
<代码>客户代码其中rootplan\u产品
<代码>路线代码=MO-A订单依据<代码>发票<代码>状态desc)”
我理解这个问题是复杂的,任何帮助都将不胜感激!
问题在于DB::raw语句。请使用以下各项:
DB::table('rootplan_product')->join('customer', function ($join) {
$join->on('customer.RouteCode', '=', 'rootplan_product.RouteCode');
$join->on('customer.CustomerCode', 'rootplan_product.CustomerCode');
})->join('invoice', 'invoice.CustomerCode', '=', 'customer.CustomerCode')
->select('invoice.InvNo', 'customer.RouteCode', 'customer.CustomerCode', 'rootplan_product.RouteplanCode', 'invoice.Status')
->where('rootplan_product.RouteCode', '123')
->whereIn('invoice.Status', ['PENDING','ACTIVE'])
->orderBy('invoice.Status', 'desc')
->get();
这将产生以下SQL:
SELECT `invoice`.`InvNo`,
`customer`.`RouteCode`,
`customer`.`CustomerCode`,
`rootplan_product`.`RouteplanCode`,
`invoice`.`Status`
FROM `test`
INNER JOIN `customer` ON `customer`.`RouteCode` = `rootplan_product`.`RouteCode`
AND `customer`.`CustomerCode` = `rootplan_product`.`CustomerCode`
INNER JOIN `invoice` ON `invoice`.`CustomerCode` = `customer`.`CustomerCode`
WHERE `rootplan_product`.`RouteCode` = ?
AND `invoice`.`Status` IN (?, ?)
ORDER BY `invoice`.`Status` DESC