Php laravel中queryScope上的复杂查询约束

Php laravel中queryScope上的复杂查询约束,php,laravel,laravel-query-builder,Php,Laravel,Laravel Query Builder,“用户”表包含以下列: 创建时间(时间戳) 最后订单(时间戳) 当创建新用户时,最后一个订单为空,并且在当前时间戳创建。 当用户下订单时,最后一个订单列将用下单时间的时间戳更新。 现在我想检索过去7天没有下订单的所有用户。我将我的用户模型定义如下: class User extends Model { /** * @var string The database table used by the model. */ public $table = 'user

“用户”表包含以下列:

  • 创建时间(时间戳)
  • 最后订单(时间戳)
  • 当创建新用户时,最后一个订单为空,并且在当前时间戳创建。 当用户下订单时,最后一个订单列将用下单时间的时间戳更新。 现在我想检索过去7天没有下订单的所有用户。我将我的用户模型定义如下:

    class User extends Model
    {
        /**
         * @var string The database table used by the model.
         */
        public $table = 'users';
    
        /**
         * @var array Validation rules
         */
        public $rules = [
        ];
        public $hasMany  = [
            'voucher' => ['ItScholarBd\Api\Models\Voucher'],
            'order' => ['ItScholarBd\Api\Models\OrderLog']
        ];
    
       public function scopeCustomer($query)
        {
            return $query->where('role_id', '=', 5);
        }
       public function scopeNew($query,$days)
        {
            return $query->where('created_at', '>=', Carbon::now()->subDays($days));
        }
       public function scopeIdle($query,$days)
       {
    
           $dayOffset = Carbon::now()->subDays($days);
    
          return $query->where(function($q,$dayOffset){
            $q->whereNull('last_order')
              ->where('created_at','<',$dayOffset);
           })->orWhere(function($q,$days){
            $q->whereNotNull('last_order')
            ->whereRaw("DATEDIFF(created_at,last_order)>$days");
           });
    
       } 
    
    }
    
    尝试使用闭包:

    return $query->where(function($q) use ($dayOffset){
    

    你不需要为你不能控制的函数构造参数。闭包将传递一个参数,您需要使用
    use
    导入任何其他变量:

    
    公共函数scopeIdle($query,$days)
    {
    $dayOffset=碳::现在()->子天($days);
    返回$query
    ->其中(函数($q)使用($dayOffset){
    $q->whereNull('last_order')
    
    ->在哪里('created_at','Thank@milken32。当last_order为空且created_at早于$days时,我们将获取数据。但是当created_at和last_order都早于$days时,则不会检索到任何数据。知道吗?您不是在检查它们是否都早于
    $days
    。您是在检查是否有超过
    $days
    天的差异在
    处创建的
    和上次订单
    之间的ce。由于上次订单始终大于处创建的
    ,因此,
    DATEDIFF()
    的结果将始终为负数。请参阅