【问题标题】:Laravel: How to query a Model Relationship only if it existsLaravel:如何仅在模型关系存在时才查询模型关系
【发布时间】:2021-11-12 05:36:29
【问题描述】:

我有一个模型Survey,其列installer_idhasOne 相关,另一个模型InstallationhasMany 另一个模型Assignment 相关。

我想编写一个查询来获取所有Survey,其中installer_id 不为空,并且如果存在Assignment,则检查所有分配(如果有status is != 2 即状态= 0 或1)返回调查.

我尝试了这个查询,但它没有捕获“如果存在分配,则检查状态”部分

 $surveys = Survey::whereNotNull('installer_id')
            ->orWhereHas('installation',function ($query) {
                return $query->whereHas('assignments',function ($q){
                    return $q->where('status','!=', 2 );
                });
        })->get();

我还尝试在模型中定义hasManyThrough 关系。

    public function assignments()
    {
        return $this->hasManyThrough(Assignment::class,Installation::class);
    }

然后使用这个查询

 $schedulables = Survey::whereNotNull('installer_id')
            ->orWherehas('assignments',function ($query){
                return $query->where('assignments.status','!=', 2 );
            })->get()

如有任何建议和帮助,我们将不胜感激

【问题讨论】:

    标签: laravel eloquent eloquent-relationship


    【解决方案1】:

    我认为您的方法是正确的,但是如果您已经要检查 whereHas,则不需要 whereNotNull,所以我认为这种方式就足够了:

    $surveys = Survey::whereHas('installation',function ($query) {
                    return $query->whereHas('assignments',function ($q){
                        return $q->where('status','!=', 2 );
                    });
            })->get();
    

    我认为您的代码中缺少 ->get();,这就是您没有得到结果的原因

    【讨论】:

    • 我仍在尝试获取所有调查,但如果他们有与分配相关的安装 - 分配状态不应为 2。
    • 另外,我正在检查installer_id 是否不为空,这是调查表上与installations 关系分开的列
    【解决方案2】:

    Original answer

    我需要的是whereDoesntHave 方法。

    $surveys = Survey::whereNotNull('installer_id')
        ->whereDoesntHave('installation.assignments', fn ($query) => $query->where('status', 2))
        ->get();
    

    【讨论】:

      猜你喜欢
      • 2014-01-18
      • 1970-01-01
      • 2015-08-06
      • 1970-01-01
      • 2019-04-04
      • 2022-01-26
      相关资源
      最近更新 更多