You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel查询作用域实现条件Where子句:多态关联有效Job查询

解决方案

你原来的scopeValid只筛选出了有关联地址的Job,完全没考虑has_office = false的情况,自然达不到预期效果。按照你的需求,有效Job分两种场景,我们需要把这两种逻辑组合进查询作用域:

正确的查询作用域代码

public function address()
{
    return $this->morphOne(Address::class, 'addressable');
}

// 查询作用域
public function scopeValid($query)
{
    return $query->where(function ($q) {
        // 场景1:不需要办公地址,直接判定为有效
        $q->where('has_office', false)
          // 场景2:需要办公地址,且必须存在对应的关联地址
          ->orWhere(function ($subQ) {
              $subQ->where('has_office', true)
                   ->has('address');
          });
    });
}

逻辑说明

  • 外层闭包用where包裹两个互斥场景,确保满足任意一个即可被判定为有效
  • 第一个分支直接匹配has_office = false的Job,这类Job无论有没有地址都符合要求
  • 第二个分支先限定has_office = true,再通过has('address')确保该Job在addresses表中有对应的关联记录

使用验证

调用Job::valid()->get()时,会返回符合以下条件的Job:

  • 所有has_office为false的记录
  • 所有has_office为true且存在对应addresses关联记录的记录

这样就完全符合你定义的「有效工作」规则了。

内容的提问来源于stack exchange,提问作者Melly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 19:42:46