为什么模型加载而whereHas是假的?

  • 本文关键字:whereHas 模型 加载 laravel
  • 更新时间 :
  • 英文 :


我有这样的查询:

$result = PortingItem::whereHas('porting', function ($query) {
$query->whereIn('status', [
Porting::STATUS_REQUESTED,
Porting::STATUS_ACCEPTED,
Porting::STATUS_DELAYED,
]);
})->where(function ($query) use ($numbers) {
$query->whereBetween('phone_number_start', [$numbers[0], $numbers[1]])
->orWhereBetween('phone_number_end', [$numbers[0], $numbers[1]]);
})->orWhere([
['phone_number_start', '<=', $numbers[0]],
['phone_number_end', '>=', $numbers[1]],
])->get();

当移植关系为空时,PortingItem模型仍然返回查询结果。我不明白为什么会这样。

这是我的Porting模型关系

public function items()
{
return $this->hasMany(PortingItem::class);
}

这是我的PortingItem模型关系:

public function porting()
{
return $this->belongsTo(Porting::class);
}

您应该始终对orWhere调用进行分组,以避免在应用全局作用域时出现意外行为。

$result = PortingItem::whereHas('porting', function ($query) {
$query->whereIn('status', [
Porting::STATUS_REQUESTED,
Porting::STATUS_ACCEPTED,
Porting::STATUS_DELAYED,
]);
})->where(function ($query) use ($numbers) {
$query->where(function ($query) use ($numbers) {
$query->whereBetween('phone_number_start', [$numbers[0], $numbers[1]])
->orWhereBetween('phone_number_end', [$numbers[0], $numbers[1]]);
})->orWhere(function ($query) use ($numbers) {
$query->where('phone_number_start', '<=', $numbers[0])
->where('phone_number_end', '>=', $numbers[1]);
});
})->get();

https://laravel.com/docs/8.x/queries逻辑分组

最新更新