用case和when语句加入laravel

csga3l58  于 2021-06-18  发布在  Mysql
关注(0)|答案(3)|浏览(725)

我在mysql中有以下查询:

  1. SELECT
  2. U.* FROM
  3. `cr_friends` AS `cf` JOIN
  4. `users` AS `U` WHERE
  5. `cf`.`status` = 1
  6. AND
  7. (
  8. CASE
  9. WHEN `cf`.`friend_to` = 1 THEN `cf`.`friend_from` = `U`.`id`
  10. WHEN `cf`.`friend_from` = 1 THEN `cf`.`friend_to` = `U`.`id`
  11. END
  12. ) GROUP BY `U`.`id` ORDER BY `cf`.`created` desc;

我试着用下面的方式把这个放在拉威尔:

  1. $myFriendsData = DB::table('cr_friends as cf')
  2. ->where('cf.status', '=', 1)
  3. ->Join('users as U')
  4. ->select(
  5. DB::raw(
  6. '(
  7. CASE WHEN cf.friend_to = ' . auth()->user()->id . ' THEN cf.friend_from = U.id END
  8. CASE WHEN cf.friend_from = ' . auth()->user()->id . ' THEN cf.friend_to = U.id END
  9. )'
  10. )
  11. )
  12. ->select('U.*')
  13. ->orderBy('U.id', 'desc')
  14. ->get();

但是没有成功,因为mysql查询运行得很好,但是这个laravel查询不会。
实际上我想的是,连接有问题,我把它放入laravel,它要求一个更多的参数,但在这种情况下,我无法做到这一点。
你们能不能指导我,让我能做到这一点。
谢谢randheer

f4t66c6m

f4t66c6m1#

用这个

  1. $myFriendsData = DB::table('cr_friends as cf')
  2. ->Join('users as U')
  3. ->where('cf.status', '=', 1)
  4. ->where(
  5. DB::raw(
  6. '(
  7. CASE WHEN cf.friend_to = ' . auth()->user()->id . ' THEN cf.friend_from = U.id END
  8. CASE WHEN cf.friend_from = ' . auth()->user()->id . ' THEN cf.friend_to = U.id END
  9. )'
  10. )
  11. )
  12. ->select('U.*')
  13. ->orderBy('U.id', 'desc')
  14. ->get();
cu6pst1q

cu6pst1q2#

提供一个空的封闭 join() 使用 whereRaw() :

  1. $myFriendsData = DB::table('cr_friends as cf')
  2. ->where('cf.status', '=', 1)
  3. ->join('users as U', function() {})
  4. ->whereRaw(
  5. '(
  6. CASE
  7. WHEN cf.friend_to = ' . auth()->user()->id . ' THEN cf.friend_from = U.id
  8. WHEN cf.friend_from = ' . auth()->user()->id . ' THEN cf.friend_to = U.id
  9. END
  10. )'
  11. )
  12. ->select('U.*')
  13. ->orderBy('U.id', 'desc')
  14. ->get();
z9gpfhce

z9gpfhce3#

我用了 DB::raw 为了 case end 中的语句 join 在laravel版本5.8中

  1. DB::table('users')
  2. ->join('settings', function ($join) {
  3. $join->on('settings.id', '=', DB::raw(case when users.type = "admin" then users.admin_setting_id else users.setting_id end'));
  4. })
  5. ->get();

相关问题