Как использовать предложение WITH в Laravel Query Builder - PullRequest
1 голос
/ 15 мая 2019

У меня SQL-запрос (см. Пример).Но я не могу найти способ, как я могу написать это в Query Builder.У вас есть какие-либо идеи, как это возможно?

WITH main AS (
    SELECT id FROM table1
)
SELECT * FROM table2
WHERE 
  table2.id IN (SELECT * FROM main)

Я хочу получить формат как:

$latestPosts = DB::table('posts')
                   ->select('user_id', DB::raw('MAX(created_at) as last_post_created_at'))
                   ->where('is_published', true)
                   ->groupBy('user_id');

$users = DB::table('users')
        ->joinSub($latestPosts, 'latest_posts', function ($join) {
            $join->on('users.id', '=', 'latest_posts.user_id');
        })->get();

, но для WITH

Ответы [ 2 ]

0 голосов
/ 15 мая 2019

Laravel не имеет встроенной поддержки общих табличных выражений.

Я создал для него пакет: https://github.com/staudenmeir/laravel-cte

Вы можете использовать его так:

$query = DB::table('table1')->select('id');

$result = DB::table('table2')
    ->withExpression('main', $query)
    ->whereIn('table2.id', DB::table('main')->select('id'))
    ->get();
0 голосов
/ 15 мая 2019

Конструктор запросов должен быть совместим с несколькими механизмами баз данных (mysql, postgresql, sql lite, sql server) и, следовательно, предлагает поддержку только общих функций.

Если ваш запрос возвращает данные, вы можетеиспользовать метод DB:select() для выполнения необработанного запроса .

$data = DB::select('WITH main AS (SELECT id FROM table1), SELECT * FROM table2 WHERE table2.id IN (SELECT * FROM main)');

Метод DB: select также принимает второй параметр для использования именованных привязок.

В качестве альтернативы доступны такие пакеты, как laravel-cte , которые добавят функциональность в Eloquent / Query Builder.

...