首页 > 解决方案 > Laravel - 如何使用 Query Builder 或 Eloquent 添加 JOIN 和 CASE-WHEN?

问题描述

我有以下工作的原始 SQL 语句,我发现使用 Laravel/Query Builder/Eloquent 将其转换为 PHP 非常困难。

SELECT aa.filepath, 
       aa.filename, 
       inst.instrument, 
       rl.raga, 
       ks.keysig, 
       aa.id    AS AAID, 
       likes.id AS LikesID 
FROM   (audioassets aa) 
       INNER JOIN instruments inst 
               ON aa.instrument_id = inst.id 
       INNER JOIN keysigs ks 
               ON aa.keysig_id = ks.id 
       LEFT JOIN ragalist rl 
              ON aa.raga_id = rl.i 
       LEFT JOIN likes 
              ON aa.id = likes.audioassets_id 
                 AND CASE likes.user_id 
                       WHEN 1 THEN true 
                       ELSE false 
                     END 
WHERE  ks.keysig LIKE '%' 
       AND inst.instrument LIKE '%';

我的笔记:

这是我的 Laravel Eloquent 代码:

$query = \App\Audioassets::where('instruments.instrument', 'LIKE', "%$ddinstselected%")
        ->where('keysigs.keysig', 'LIKE', "%$ddkeyselected%")
        ->join('instruments', 'audioassets.instrument_id', '=', 'instruments.id')
        ->leftjoin('ragalist', 'audioassets.raga_id', '=', 'ragalist.id')
        ->join('keysigs', 'audioassets.keysig_id', '=', 'keysigs.id')
        ->leftjoin('likes', 'likes.audioassets_id', '=', 'audioassets.id')
        ->where('likes.user_id', '=', $authuserid)
        ->select('audioassets.filepath', 'audioassets.filename', 
'instruments.instrument', 'ragalist.raga', 'keysigs.keysig', 'audioassets.id', 'likes.id as likesid');

这在 Laravel 中运行良好,但不包含 CASE-WHEN SQL,因此所有“喜欢”都会显示给所有用户。

任何帮助将不胜感激!

标签: phpmysqlsqllaraveleloquent

解决方案


您可以尝试以下查询

myFriendsData = DB::table('audioassets as aa')
    ->where('ks.keysig', 'LIKE', '%')
    ->join('instruments', 'audioassets.instrument_id', '=', 'instruments.id')
    ->leftjoin('ragalist', 'audioassets.raga_id', '=', 'ragalist.id')
    ->join('keysigs', 'audioassets.keysig_id', '=', 'keysigs.id')
    ->join('likes ',audioassets.id = likes.audioassets_id, function() {})
    ->whereRaw(
        '( 
            CASE 
                 WHEN likes.user_id = 1 THEN true ELSE false     
            END
        )'
    )
    ->select('audioassets.filepath', 'audioassets.filename','instruments.instrument', 'ragalist.raga', 'keysigs.keysig', 'audioassets.id', 'likes.id as likesid');
    ->get();

推荐阅读