亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用 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 關注
  • 175 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號