【问题标题】:Laravel: select students who do not have payment made in the monthLaravel:选择当月没有付款的学生
【发布时间】:2019-08-08 09:52:25
【问题描述】:

我想列出当月未付款或从未付款的学生。 可以使用单个查询构建器或雄辩的函数吗? 使用下面的代码,我可以做与我想要的完全相反的事情:/

$indebted = DB::table('students')->where('students.active',1)   
            ->leftJoin('payments', 'students.id', '=', 'payments.user_id')
            ->whereMonth('payments.created_at','=', $today->month)
            ->get();

【问题讨论】:

  • 根据您的数据计划有多大,如果您没有正确索引数据,那么使用这些“帮助”函数对数据库优化来说是很糟糕的。本质上,它们将日期列包装在一个函数周围,例如 MONTH(payments.created_at) = '05' - 这将强制对该列进行顺序扫描,因为该函数是易变的。为了优化这一点,您需要创建功能索引“CREATE INDEX idx_blah ON Payments (month(created_at))”或执行日期范围“->whereBetween('payments.created_at', [$today->startOfMonth, $ today->endOfMonth]) (假设 $today 是 Carbon 日期)

标签: php database laravel eloquent query-builder


【解决方案1】:

我不知道你在这里传递了什么值。

$today->month

你必须在这里传递确切的月份而不是这个 $today->month

请试试这个

$indebted = DB::table('students')->where('students.active',1)   
            ->leftJoin('payments', 'students.id', '=', 'payments.user_id')
            ->whereMonth('payments.created_at','=', 06)
            ->get();

【讨论】:

    【解决方案2】:

    这是在当前月份和年份付款的学生ID

    $payments= DB::table('payments')
                ->whereMonth('created_at',date('m'))
                ->whereYear('created_at', date('Y'))
                ->pluck('user_id')->all();
    

    使用whereNotIn('id',[付款的学生ID])

    $students = DB::table('students')
                ->whereNotIn('id',$payments)
                ->get();
    

    【讨论】:

      【解决方案3】:

      您可以在这种情况下使用 Raw SQL 我假设您使用的是 mysql 数据库

      $sql=SELECT * from students s LEFT JOIN payments p ON s.id=p.user_id
      WHERE s.active=1 AND (p.created_at is NULL or MONTH(MAX(p.created_at) < MONTH(CURRENT_DATE()))  )
      
      $students = DB::connection('mysql')->select( DB::raw(" $sql"));
      foreach($students as $aStudent){
           ...
           ....
      }
      

      【讨论】:

        【解决方案4】:

        你可以得到本月没有付款的学生

        $students = App\student::whereDoesntHave('payments', function (Builder $query) {
              $query->whereMonth('payments.created_at',$today->month);
        })->where('active',1)->get();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-04-29
          • 2018-11-19
          • 1970-01-01
          • 2018-06-06
          • 2013-01-13
          • 2022-01-05
          • 1970-01-01
          相关资源
          最近更新 更多