Конструктор запросов 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);
}
→ Ссылка