Laravel,如何在查询范围中执行条件where子句

xjreopfe  于 2023-03-19  发布在  其他
关注(0)|答案(3)|浏览(145)

我有一个表叫做jobsaddresses,它们有一对一的多态关系,在jobs表中有一列has_office,这列表示一个作业是否需要地址。
我需要创建一个查询范围,该范围只能查询Job::valid()有效的作业。有效的意义在于,如果作业的has_office设置为true,则它需要在addresses表中有一个地址示例才有效。但是,如果设置为false,则不需要地址。
如果尝试:

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

//QUERY SCOPES 

public function scopeValid()
{
    return $this->has('address');
}

但并不是我想要的那样。

uajslkp6

uajslkp61#

范围必须返回查询生成器示例。

public function scopeValid($query){
   return  $query->has('address')->exists();
}

然后您可以像下面这样使用它

Job::valid()

public function scopeValid($query){
       return  $query->has('address');
    }

以及

Job::valid()->exists()
ruoxqz4g

ruoxqz4g2#

您可以修改scopeValid()查询作用域,以处理作业和地址表之间的多态关系,如下所示:

public function scopeValid($query)
{
    return $query->where(function ($query) {
        //jobs that don't require address
        $query->where('has_office', false)
              ->orWhereHasMorph('addressable', '*', function ($query, $type) {
                    //jobs that require address and have an address instance.
                    $query->where('addressable_type', $type)
                          ->has('address');
              });
    });
}
o8x7eapl

o8x7eapl3#

你需要修改scopeValid函数来包含对has_office列的检查。下面是一个如何修改代码的例子:

public function scopeValid($query)
{
    return $query->where(function ($query) {
        $query->where('has_office', false)
              ->orWhereHas('address');
    });
}

确保对作业模型调用scopeValid函数,如下所示:

$validJobs = Job::valid()->get();

相关问题