为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 Query Builder 或 Eloquent 添加 JOIN 和 CASE-WHEN?

如何使用 Query Builder 或 Eloquent 添加 JOIN 和 CASE-WHEN?

PHP
慕斯王 2022-07-09 16:17:00
我有以下工作的原始 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,因此所有“喜欢”都会显示给所有用户。任何帮助将不胜感激!
查看完整描述

3 回答

?
跃然一笑

TA贡献1826条经验 获得超6个赞

您可以尝试以下查询


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


查看完整回答
反对 回复 2022-07-09
?
呼如林

TA贡献1798条经验 获得超3个赞

您可以使用提前连接子句和DB::raw():


<?php

$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')

    // Use join clause.

    ->leftJoin('likes', function ($join) {

        $join->on('aa.id', '=', 'likes.audioassets_id')

             // CASE WHEN by DB::raw()

             ->on(DB::raw('CASE likes.user_id WHEN 1 THEN true ELSE false'));

    )

    ->where('likes.user_id', '=', $authuserid)

    ->select(

        'audioassets.filepath',

        'audioassets.filename', 

        'instruments.instrument',

        'ragalist.raga',

        'keysigs.keysig',

        'audioassets.id',

        'likes.id as likesid'

    );

连接子句 API 参考:Illuminate\Database\Query\JoinClause | Laravel API


查看完整回答
反对 回复 2022-07-09
?
慕的地6264312

TA贡献1817条经验 获得超6个赞

我没有回过头来回复这个帖子中的所有伟大帮助者,但答案是上面提供的两个答案的混合。这是完美运行的最终代码:


$query = \App\Audioassets::where('instruments.instrument', 'LIKE', "%$ddinstselected%")

->where('keysigs.keysig', 'LIKE', "%$ddkeyselected%")

->leftJoin('likes', function ($join) use ($authuserid) {

    $join->on('audioassets.id', '=', 'likes.audioassets_id');

    $join->whereRaw(

        '(

                CASE

                    WHEN likes.user_id=? THEN true ELSE false

                END

        )'

        , [$authuserid]);

    })

->join('instruments', 'audioassets.instrument_id', '=', 'instruments.id')

->leftjoin('ragalist', 'audioassets.raga_id', '=', 'ragalist.id')

->join('keysigs', 'audioassets.keysig_id', '=', 'keysigs.id')

->select('audioassets.filepath', 'audioassets.filename', 'instruments.instrument', 'ragalist.raga', 'keysigs.keysig', 'audioassets.id', 'likes.id as likesid');



查看完整回答
反对 回复 2022-07-09
  • 3 回答
  • 0 关注
  • 151 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号