在Laravel的查询构建器中,是否可以用两个键左连接一个表,如果其中一个键存在,它就具有优先权?

kgqe7b3p  于 2022-12-24  发布在  其他
关注(0)|答案(1)|浏览(110)

我正在Eloquent Query Builder中尝试左联接表,但该表有两个潜在外键。我只想联接一次,但如果潜在的其他列不为空,则它应该具有优先级。

DB::connection('...')->table('some_table')
    ->leftJoin('table_that_should_take_presedence as ttstp', 'ttstp.id', '=', 'some_table.ttstp_id')
    ->leftJoin('some_other_table', function ($otherTable) {
        $otherTable->on('some_other_table.id', '=', 'ttstp.some_other_table_id');
            //->.... if ttstp.some_other_table_id does not exist then
            //       some_table.some_other_table_id should be used
    });

到目前为止,我的解决方案是两次连接表,并使用合并来启用该存在性:

DB::connection('...')->table('some_table')
        ->selectRaw('coalesce(sot.example, sot2.example, null) as example')
        ->leftJoin('table_that_should_take_presedence as ttstp', 'ttstp.id', '=', 'some_table.ttstp_id')
        ->leftJoin('some_other_table as sot', 'sot.id', '=', 'ttstp.some_other_table_id');
        ->leftJoin('some_other_table as sot2', 'sot2.id', '=', 'some_table.some_other_table_id');

这似乎并不圆滑,我觉得最佳的解决方案是加入一次。任何帮助感激。提前感谢。

lb3vh1jj

lb3vh1jj1#

据我所知,你想要这个:

$q = DB::connection('...')
    ->table('some_table')
    ->selectRaw('sot.example')
    ->leftJoin('table_that_should_take_presedence as ttstp', 'ttstp.id', '=', 'some_table.ttstp_id')
    // Try to join by ttstp.some_other_table_id column, if it's null then use some_table.some_other_table_id column
    ->leftJoin('some_other_table as sot', 'sot.id', '=', DB::raw('COALESCE(ttstp.some_other_table_id, some_table.some_other_table_id)'));

dump($q->toSql());

相关问题