Конструктор запросов Laravel, как перевести сырой запрос в Laravel
Всех приветствую, к сожалению не смог перевести мой сырой запрос в конструкцию Laravel. Подскажите как работать с подобными выборками?
select distinct a.*, b.`канал отчет`, b.`источник отчет`
from (
select leed,count(leed) as kol_vo,date_lead from (
select concat(source,' ',medium) as leed,date as date_lead
from leads
where (site_id = 40015) and (date > '2022-08-12' and date < '2022-08-14')) s
group by leed,date_lead) a
join
(select concat(source,' ',medium) as leed, `канал отчет`, `источник отчет`
from google_match_docs) b on a.leed = b.leed
site_id и значения даты в условии динамические. Как вариант можно использовать PDO. Но к сожалению не могу в данной конкретной задаче ((
Ответы (1 шт):
Автор решения: Reaper
→ Ссылка
Можно сделать через представление. Создаешь миграцию в консоли командой
php artisan make:migration create_request_list_view
Изменяешь файл миграции на это:
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Facades\DB;
class CreateRequestListView extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Illuminate\Support\Facades\DB::statement($this->createView());
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Illuminate\Support\Facades\DB::statement($this->dropView());
}
/**
* Reverse the migrations.
*
* @return void
*/
private function createView(): string
{
return <<<SQL
CREATE VIEW request_list_view AS
select distinct a.*, b.`канал отчет`, b.`источник отчет`
from (
select leed,count(leed) as kol_vo,date_lead from (
select concat(source,' ',medium) as leed,date as date_lead
from leads
where (site_id = 40015) and
(date > '2022-08-12' and date < '2022-08-14')) s
group by leed,date_lead) a
join
(select concat(source,' ',medium)
as leed, `канал отчет`, `источник отчет`
from google_match_docs) b on a.leed = b.leed
SQL;
}
/**
* Reverse the migrations.
*
* @return void
*/
private function dropView(): string
{
return <<<SQL
DROP VIEW IF EXISTS `request_list_view`;
SQL;
}
}
После этого используешь команду: php artisan migrate.
Создаешь модель:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class request_list_view extends Model
{
use HasFactory;
public $table = 'request_list_view';
}
И создаешь контроллер:
<?php
namespace App\Http\Controllers;
use App\Models\request_list_view;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
class RequestListViewController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$users = request_list_view::select('*')
->get()
->toArray();
dd($users);
}