Сложный запрос внутреннего соединения MySQL с помощью Laravel Query Builder - PullRequest
0 голосов
/ 19 декабря 2018

Я пытаюсь выполнить этот запрос с помощью Laravel Query Builder. Я думаю, что запрос правильный, потому что когда я запускаю запрос в MySQL Workbench, запрос выполняется и я получаю ожидаемые результаты. Я знаю, что мы можем написать необработанный запрос с помощью построителя запросов laravel, но он открыт для внедрения 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]: столбец не найден: 1054Неизвестный столбец '' in 'в предложении' (SQL: выберите invoice. InvNo, customer. RouteCode, customer. CustomerCode, rootplan_product. RouteplanCode, invoice. Status из rootplan_product внутреннее объединение customer в customer. RouteCode = rootplan_product. RouteCode и (customer.CustomerCode = rootplan_product.CustomerCode) = `` внутреннее объединение invoice в invoice.CustomerCode = customer. CustomerCode, где rootplan_product. RouteCode = MO-A заказ на invoice. Status desc) "

Я понимаю, что запрос сложныйи любая помощь будет оценена!

1 Ответ

0 голосов
/ 19 декабря 2018

Проблема была с оператором 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
...