簡體   English   中英

Laravel子連接選擇查詢

[英]Laravel sub join select query

我正在嘗試解決如何在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');

但是我似乎無法得到我想要的結果! 有任何想法嗎?

你必須使用whereColumn()而不是where()

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

這段代碼可能有用,

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()方法在執行之前打印出查詢字符串,以確保您真正獲得所需的查詢。

謝謝大家。 我的最終解決方案如下 -

// 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為$query->whereColumn()上的提示實現了一些DB::raw()和@Jonas $query->whereColumn()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM