Я пытаюсь выполнить этот запрос с помощью 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
убывание)»
Я понимаю, что запрос сложный, и любая помощь будет оценена!
Проблема была с оператором 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
Других решений пока нет …