Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用Laravel查询生成器的复杂MySQL内部连接查询_Php_Mysql_Laravel_Laravel Query Builder_Laravel 5.7 - Fatal编程技术网

Php 使用Laravel查询生成器的复杂MySQL内部连接查询

Php 使用Laravel查询生成器的复杂MySQL内部连接查询,php,mysql,laravel,laravel-query-builder,laravel-5.7,Php,Mysql,Laravel,Laravel Query Builder,Laravel 5.7,我正在尝试使用Laravel查询生成器运行此查询我认为查询是正确的,因为当我在MySQL工作台中运行查询时,查询会执行,我会得到预期的结果。我知道我们可以使用laravel query builder编写原始查询,但它存在SQL注入漏洞。所以我试着不带任何疑问地继续下去 这就是问题所在 SELECT invoice.InvNo,customer.RouteCode,customer.CustomerCode,rootplan_product.RouteplanCode,invoice.Statu

我正在尝试使用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 product
RouteCode
和(customer.CustomerCode=rootplan\u product.CustomerCode)=``内部联接
发票
发票上
客户代码=
客户代码
其中
根计划\产品
路径编码
=MO-A订单由
发票
状态描述)


我知道查询很复杂,希望您能提供帮助!

问题在于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

问题在于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

在我看来,您的DB::raw连接似乎正在引发问题,您是否尝试过像上面一行中的连接那样执行此操作?@SplittyDev是的..我尝试过,但无法找出查询中的内部连接和部分。因此,我尝试了这种方法,我相信您可以执行以下操作:
$join->on('customer.RouteCode','=','rootplan\u product.RouteCode')->何处('customer.CustomerCode'、'='、'rootplan_product.CustomerCode');
对我来说,您的DB::raw连接似乎造成了问题,您是否尝试过像上面一行中的连接那样进行连接?@SplittyDev是的。。我尝试过,但我无法找出与查询的内部连接和部分。因此我尝试了这种方法我相信您可以做到以下几点:
$join->on('customer.RouteCode'、'='、'rootplan\u product.RouteCode')->其中('customer.CustomerCode'、'='、'rootplan\u product.CustomerCode');