php - Laravel - 如何使用查询生成器或 Eloquent 添加 JOIN 和 CASE-WHEN?

标签 php mysql sql laravel eloquent

我有以下有效的原始 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 '%';

我的笔记:

  • 我遇到的问题是尝试让 CASE-WHEN 代码在 Laravel 中工作

  • “WHEN”后面的“1”是一个变量,所以现在仅用于测试

  • 我想做的就是在“仪表板”上显示文件列表,并显示当前登录用户“喜欢”的文件(没有其他人喜欢)

这是我的 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,因此所有用户都会显示所有“喜欢”。

任何帮助将不胜感激!

最佳答案

您可以尝试使用以下查询

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();

关于php - Laravel - 如何使用查询生成器或 Eloquent 添加 JOIN 和 CASE-WHEN?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59556697/

相关文章:

PHP 处理和渲染页面速度更快

php - 如何在 Laravel 8 中全局定义验证规则?

javascript - 选择下拉列表时生成更多 MYSQL 数据库结果

MySQL 查询 : Select Most

sql - 搜索过滤列

sql - 排除某些列中具有相同值的行

php - 使用 php 发送带附件的电子邮件

mysql - MYSQL 存储过程中的 DELETE FROM

php - 如何在 MySQL 中存储 GMaps API 反向地理编码响应(使用 PHP)?

javascript - Document.write() 在 WordPress header 中不起作用