簡體   English   中英

如何在 laravel 中為 whereIn 使用別名

[英]How to use alias for whereIn in laravel

我試圖在 laravel 5.2 中使用whereIn()方法,但它突然返回一個column not found error

Controller

$users = \App\User::select([
    DB::raw('(CASE WHEN users.id < 4 THEN users.id ELSE "" END) as user_id')
]);

$users->whereIn('user_id', [1,2,3]);

return $users->get();

錯誤

未找到列:1054 未知列 'user_id'

whereIn 只能應用於列,因為您沒有該列,只需創建它!

您可以使用子查詢執行此操作,然后加入它

 $query1 = $users = \App\Models\User::select([
            DB::raw('users.id as id_to_join,(CASE WHEN users.id < 4 THEN users.id ELSE "" END) as user_id')
        ]);
        $value=User::joinSub($query1,'query1',function ($join){
            $join->on('users.id', '=', 'query1.id_to_join');
        })->whereIn('user_id', [1,2,3])->get();

如果您的 laravel 版本不支持 joinsub,您可以使用查詢生成器執行此操作:

 $value=DB::table('users')->join(
            DB::raw('(select users.id as id_to_join ,(CASE WHEN users.id < 4 THEN users.id ELSE "" END) as user_id from users)subJoin')
            ,function($join){
            $join->on('users.id', '=', 'subJoin.id_to_join');
        })->whereIn('user_id', [1,2,3])->get();

您的邏輯似乎是大於 3 的用戶 ID 值將被忽略。 如果是這樣,那么只需在調用whereIn()時直接檢查id列:

$users = \App\User::select([
    DB::raw('(CASE WHEN users.id < 4 THEN users.id ELSE "" END) as user_id')
]);
$users->whereIn('id', [1,2,3]);
return $users->get();

如果您確實需要在同一級別的查詢中重用別名,避免子查詢,您可以使用 MySQL 的重載HAVING子句:

$users = \App\User::select([
    DB::raw('(CASE WHEN users.id < 4 THEN users.id ELSE "" END) as user_id')
]);
$users->havingRaw('user_id in (1,2,3)')
return $users->get();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM