2013-06-13 37 views
11

Có ai có kinh nghiệm trong PHP & Laravel Eloquent có thể giúp tôi giải quyết tuyên bố này không? Tôi đang cố gắng tiêm một CASE ... WHEN .. END ... bên trong một phương thức raw(). Dường như nó hoàn toàn bị bỏ qua. Tài liệu hiện tại chưa có. Tôi đã thử nhiều thứ khác nhau để không thắng thế. Tôi đang cố gắng để kéo giảm này:Laravel Eloquent Chọn CASE?

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

Mã nguồn có dưới đây:

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

Trả lời

29

Di chuyển raw() cuộc gọi của bạn bên trong tuyên bố 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') 

Từ: https://laravel.com/docs/5.4/queries#raw-expressions

0

Hoặc bạn có thể sử dụng selectRaw thay thế.

->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') 
Các vấn đề liên quan