Laravel sub join запрос выбора

Я пытаюсь понять, как повторить приведенный ниже запрос в Laravel. То, что я пытаюсь сделать, это получить самый последний статус от table2 / t2 и объединить его с нашей первичной записью table1 / t1

select id, created_at, t2.status from table1 t1

left join table2 t2 ON 52.id = (
SELECT MAX(id) from table2
where table2.submission_id = submission_id
) AND t1.id = t2.submission_id

Этот запрос выше работает блестяще, но я не могу понять, как повторить это в «родном» Laravel —

$query = Table1::query();
$query->join('table2 as t2', function (JoinClause $join) {
$join->selectRaw('MAX(id)')
->where('t2.submission_id', '=', 'submission_id');
}, '=', 't2.id');

Я также попробовал joinSub —

$query->joinSub(function (Builder $query) {
$query
->selectRaw('MAX(id)')
->from('table2 as t2')
->where('t2.submission_id', '=', 'bespoke_submission_id');
}, 't2', 't1.id', '=', 't2.id', 'left');

Однако я не могу добиться желаемого результата! Есть идеи?

3

Решение

Вы должны использовать whereColumn() вместо where():

->whereColumn('t2.submission_id', '=', 'bespoke_submission_id')
2

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

Этот код может работать,

DB::table('table1 t1')
->select(['id', 'created_at', 't2.status'])
->leftJoin('table2 t2', function ($join) {
$subQuery = DB::table('table2')
->selectRaw('MAX(id)')
->whereRaw('table2.submission_id = submission_id');
$join->on('t2.id', DB::raw('(' . $subQuery->toSql() . ')'))->whereRaw('t1.id = t2.submission_id');
});

Или этот

DB::table('table1 t1')
->select(['id', 'created_at', 't2.status'])
->leftJoin('table2 t2', function ($join) {
$subQuery = DB::raw('(select MAX(id) from table2 where table2.submission_id = submission_id)');
$join->on('t2.id', $subQuery)->whereRaw('t1.id = t2.submission_id');
});

Примечание: вы можете использовать ->toSql() метод, чтобы распечатать строку запроса перед ее выполнением, чтобы убедиться, что вы действительно получаете запрос, который вы хотите.

1

Спасибо всем. Мое окончательное решение было следующее —

// write begin making our query
$query = Model::query();

// filter by status
$args = ['status' => 'approved'];

// create our sub query
$subQuery = DB::raw(
'(SELECT MAX(id) from table2 ' .
'where t2.submission_id = submission_id)'
);

// join to retrieve our revisions table
$query->leftJoin('table2 as t2', 't2.id', '=', $subQuery);
$query->whereColumn('table1.id', '=', 't2.submission_id');
$query->where('t2.status', '=', $args['status']);

$results = $table->get();

Затем это создает желаемый результат, так что спасибо @Kyaw Kyaw Soe за указатель на реализацию немного DB::raw() и @Jonas Staudenmeir за отзыв о $query->whereColumn()

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