【问题标题】:In Laravel Eloquent, how to check for multiple relationship existence in one "has"?在 Laravel Eloquent 中,如何检查一个“有”中是否存在多个关系?
【发布时间】:2019-03-30 04:53:10
【问题描述】:

因此,为了检查模型上是否存在关系,我们对关系使用has 函数,例如model1->has('relationship1')

虽然可以为model1->with() 函数提供一个关系数组以急切加载它们,但haswhereHas 函数都不接受数组作为参数。如何检查是否存在多个关系?

现在,我在同一个模型上运行多个has 函数(关系没有嵌套):

model1->has('relationship1')
      ->has('relationship2')
      ->has('relationship3')

但这很乏味且容易出错。有人解决吗?

【问题讨论】:

    标签: laravel eloquent


    【解决方案1】:

    很遗憾,没有办法将关系数组传递给has()whereHas(),但您可以改用QueryScope。在您的 Model 上,定义以下内容:

    public function scopeCheckRelationships($query){
      return $query->has("relationship1")->has("relationship2")->has("relationship3");
    }
    

    然后,在Controller 中查询您的Model 时,只需运行:

    $result = Model::checkRelationships()->get();
    

    使用Scope的函数名是函数名,减去scope这个词,所以scopeCheckRelationships()被用作checkRelationships()

    此外,实际上可以将要查询的关系作为参数传递:

    public function scopeCheckRelationships($query, $relationships = []){
      foreach($relationships AS $relationship){
        $query->has($relationship);
        // Might need to be `$query = $query->has(...);`, but I don't think so.
      }
      return $query;
    }
    
    ...
    
    $result = Model::checkRelationships(["relationship1", "relationship2", "relationship3"])->get();
    

    如果你需要它是动态的。

    如果您需要更多信息,这里是查询范围的文档:https://laravel.com/docs/5.8/eloquent#query-scopes

    【讨论】:

    • 相当令人失望。我认为团队应该为此制作一个功能。不过还是谢谢。
    • 我听到了。 Laravel 是开源的,所以你可能会建议在未来的版本中实现它,或者,如果你真的很精通,你可以自己修改代码并提出拉取请求。虽然可能有点复杂,但也可能非常简单。很难说。
    猜你喜欢
    • 2017-10-24
    • 1970-01-01
    • 2020-04-05
    • 2022-01-12
    • 2014-05-28
    • 1970-01-01
    • 2017-10-08
    • 2017-09-14
    • 1970-01-01
    相关资源
    最近更新 更多