【问题标题】:select all columns which are not in another table laravel 5.5选择不在另一个表中的所有列 laravel 5.5
【发布时间】:2017-09-23 21:53:01
【问题描述】:

我有两张桌子 - 第一张叫做“users”,第二张叫做“buy_courses”。

我正在尝试选择 user_name 不在 buy_courses 中的所有用户。我尝试了类似的东西 -

$users = DB::table('users')
                ->rightjoin('buy_courses', 'users.user_name', '=', 'buy_courses.user_name')
                ->get();

当我使用“”时,它返回所有用户名在“buy_courses”中的用户,然后我得到所有用户。正确的查询应该是什么?

【问题讨论】:

    标签: php mysql laravel


    【解决方案1】:

    用 Eloquent 试试吧:

    $courseUserNames = BuyCourses::pluck('user_name')->all();
    $users = User::whereNotIn('user_name', $courseUserNames)->select(...)->get();
    

    或者,如果您更喜欢使用数据库查询:

    $courseUserNames = DB::table('buy_courses')->pluck('user_name')->all();
    $users = DB::table('users')->whereNotIn('user_name', $courseUserNames)->select(...)->get();
    

    【讨论】:

      【解决方案2】:

      您可以使用 SQL 的“NOT IN”。

      例子:

      mysqli_query($con, "SELECT * FROM users WHERE user_name NOT IN (SELECT user_name FROM buy_courses)");
      

      【讨论】:

      • Laravel 使用 PDO 而不是 mysqli_。你从来没有读过这个问题,只是跳出来发布答案。
      【解决方案3】:
      DB::table("users")->select('*')->whereNotIn('user_name',function($query) {
      
         $query->select('user_name')->from('buy_courses');
      
      })->get();
      

      只是 join 实际上是 Laravel 中的内部连接,所以实际上也许你也可以尝试:

      DB::table('users')
                  ->join('buy_courses', 'users.user_name', '=', 'buy_courses.user_name')
                  ->get();
      

      【讨论】:

      • join 如何解决这个问题,因为它将返回两者共有的行?这不是 OP 所期望的。
      【解决方案4】:

      只需将 = 替换为 != ,使用函数 join

      $users = DB::table('users')
        ->join(
          'buy_courses', 
          function ($join)
          {$join->on('users.user_name', '!=', 'buy_courses.user_name');}
        )
        ->get();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-11-13
        • 2021-01-26
        • 2016-02-29
        • 2011-03-30
        • 1970-01-01
        • 2021-12-30
        相关资源
        最近更新 更多