【问题标题】:Laravel Eloquent Select CASE?Laravel Eloquent 选择 CASE?
【发布时间】:2013-06-10 03:16:19
【问题描述】:

有没有在 PHP 和 Laravel Eloquent 方面有经验的人可以帮我解决这个问题?我正在尝试在 raw() 方法中注入 CASE... WHEN.. END...。似乎完全被忽略了。现有的文档还没有。我尝试了几种不同的方法,但没有成功。我正在努力解决这个问题:

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

【问题讨论】:

    标签: sql select laravel case eloquent


    【解决方案1】:

    将您的 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

    【讨论】:

    • 不错,很有用
    • 如果您使用数组来选择字段,将原始查询推送到该数组并使用它例如:array_push($columnArr, DB::raw("(CASE WHEN isActive = 1 THEN 'Active' ELSE 'Inactive' END) as Active_Status"));然后写 DB::table($table) ->select($columnArr)
    • 我们如何使用 CASE 语句设置 where 条件?请建议。谢谢
    • '(CASE WHEN users.id = ' . $user . ' THEN 1 ELSE 0 END) AS is_user' 看起来你可以进行 SQL 注入 ...
    【解决方案2】:

    您也可以改用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')
    

    【讨论】:

      猜你喜欢
      • 2015-02-23
      • 1970-01-01
      • 2014-02-10
      • 1970-01-01
      • 2013-04-03
      • 2018-12-07
      • 1970-01-01
      • 2015-10-08
      • 2021-03-26
      相关资源
      最近更新 更多