2013-06-13 5 views
11

Есть ли кто-нибудь с опытом работы в PHP & Laravel Eloquent, который может помочь мне разрешить это утверждение? Я пытаюсь ввести CASE ... WHEN .. END ... внутри метода raw(). Казалось, что он полностью проигнорирован. Существующей документации не было. Я пробовал несколько разных вещей, чтобы не превалировать. Я пытаюсь провернуть это:Laravel Eloquent Выберите CASE?

SELECT shares.id, ..., 
    CASE WHEN users.id = <CurrentUser> THEN 1 ELSE 0 END AS is_user, 
    ... 
FROM <table> 
... 

Исходный код ниже:

$shares = Share::where('shares.status', '=', SHARE_STATUS_APPROVED) 
        ->where('shares.deleted', '=', '0') 
        ->where('locations.lat', '<=', $nelat) 
        ->where('locations.lat', '>=', $swlat) 
        ->where('locations.lng', '>=', $nelng) 
        ->where('locations.lng', '<=', $swlng) 
        ->where('users.id', '=', $user) 
        ->orWhere('shares.connected_user_id', '=', $user) 
        ->join('users', 'shares.user_id', '=', 'users.id') 
        ->join('locations', 'locations.id', '=', 'users.location_id') 
        ->join('provinces', 'provinces.id', '=', 'locations.province_id') 
        ->join('countries', 'countries.id', '=', 'locations.country_id') 
        ->select('shares.id AS share_id', 'users.id AS user_id', 'shares.connected_user_id', 'shares.original_language_id', 'shares.image', 
         'users.first_name', 'users.last_name', 'users.email', 
         'locations.city', 'provinces.name', 'countries.code', 
         'locations.lat', 'locations.lng', 
         'shares.created_at') 
        ->raw('(CASE WHEN users.id = ' . $user . ' THEN 1 ELSE 0 END) AS is_user') 
        ->orderBy('shares.created_at', 'desc') 
        ->orderBy('users.id', 'asc') 
        ->orderBy('shares.connected_user_id', 'asc') 
        ->get(); 

ответ

29

Перемещайте raw() вызов внутри SELECT заявление:

->select('shares.id AS share_id', 'users.id AS user_id', 'shares.connected_user_id',  
    'shares.original_language_id', 'shares.image', 
    'users.first_name', 'users.last_name', 'users.email', 
    'locations.city', 'provinces.name', 'countries.code', 
    'locations.lat', 'locations.lng', 
    'shares.created_at', 
    DB::raw('(CASE WHEN users.id = ' . $user . ' THEN 1 ELSE 0 END) AS is_user') 
) 
->orderBy('shares.created_at', 'desc') 

От: https://laravel.com/docs/5.4/queries#raw-expressions

0

В качестве альтернативы вы можете использовать selectRaw.

->selectRaw("shares.id AS share_id, users.id AS user_id , 
    shares.connected_user_id ,  
     shares.original_language_id, shares.image, 
     users.first_name, users.last_name, users.email, 
     locations.city, provinces.name, countries.code, 
     locations.lat, locations.lng, 
     shares.created_at, 
     (CASE WHEN users.id = {$user} THEN 1 ELSE 0 END) AS is_user)") 
    ->orderBy('shares.created_at', 'desc') 
Смежные вопросы