Laravel filter whereIn by whereNotIn



我正在创建一个查询范围来检索一些数据。

我们希望在存在include_ids[1,2,3]的情况下获得结果,但如果模型也是exclude_ids[4,5]的一部分,则对其进行筛选。

如果用户订阅了2和4,则不应选择它们。但是,应该选择订阅了1,2或3而不是4,5的用户。

我已经处理了一段时间了,它应该看起来像这个

  1. 将所有内容包装在where语句中
  2. 加载与其他模型存在关系的数据
  3. 获取存在In incl_ids的关系的数据
  4. 如何通过excl_ids过滤点3

也许我们应该在excl_id上循环,当excl_id为true时不加载数据?

public function scopeLoadExcept ($query, $incl_ids, $excl_ids)
{
return $query->where(function ($q) use ($incl_ids, $excl_ids) {
return $q->whereHas('relationship', function ($qq) use ($incl_ids, $excl_ids) {
return $qq->whereIn('foreign_id', $incl_ids)->where(function ($qqq) use ($excl_ids) {
return $qqq->whereNotIn('foreign_id', $excl_ids); // filter this
});
});
});
}

您应该使用whereDoesntHave方法

public function scopeLoadExcept($query, $incl_ids, $excl_ids)
{
return $query->where(
function ($q) use ($incl_ids, $excl_ids) {
return $q->whereHas(
'relationship',
function ($qq) use ($incl_ids, $excl_ids) {
return $qq->whereIn('foreign_id', $incl_ids);
}
)->whereDoesntHave(
'relationship',
function ($qq) use ($incl_ids, $excl_ids) {
return $qq->whereIn('foreign_id', $excl_ids);
}
);
}
);
}

实际上,你不需要使用如下参数分组:

public function scopeLoadExcept($query, $incl_ids, $excl_ids)
{
return $query->whereHas(
'relationship',
function ($qq) use ($incl_ids) {
return $qq->whereIn('foreign_id', $incl_ids);
}
)->whereDoesntHave(
'relationship',
function ($qq) use ($excl_ids) {
return $qq->whereIn('foreign_id', $excl_ids);
}
);
}

最新更新