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
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()
的结果将始终为负数。请参阅