Сложный запрос внутреннего соединения MySQL с помощью Laravel Query Builder

Я пытаюсь выполнить этот запрос с помощью 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 Неизвестный столбец » в ‘предложении’ (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 убывание)»

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

0

Решение

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

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector