首页 > 解决方案 > Eloquent - 检查远程关系上是否存在 id

问题描述

我需要检查与产品的远距离关系中是否存在国家 ID。我只需要一个真或假作为结果。我还没有弄清楚如何提出查询。每个模型中定义了不同的关系:

产品 - 属于ToMany ShippingProfile

ShippingProfile - hasMany 方法

方法 - 属于 ShippingZone

ShippingZone - 属于ToMany国家

因此,如果我有产品 id 2 和国家/地区 id 5,我想知道该国家/地区 id 是否在属于产品配置文件的任何方法内的任何区域中可用。(实际上,每个产品只有一个配置文件,但它被定义为 belongsToMany 并带有一个数据透视表)。

作为第一步,我尝试访问国家/地区,但我无法使用以下语法访问它:

$prod = \App\Product::find(2)
       ->shipping_profiles()
       ->methods()->zones()->countries();

我得到错误:“Call to undefined method Illuminate\\Database\\Query\\Builder::methods()

(尽管在 shippingProfiles 中正确定义了methods())。

编辑2

使用“with”,我可以对国家/地区进行“位置”检查,但如果我提供一个不存在的国家/地区,它不会失败 - 它只会返回带有属性的产品和一个带有空国家/地区数组的区域:

return $prod = \App\Product::find(2)->with([
            'shipping_profiles.methods.zone.countries' => function($query) {
             $query->where('countries.id', 10000);
       }])->firstOrFail();

因此,如果您可以建议任何其他返回 true/false 或返回 zone 或 null 的方法,这就是我正在寻找的......

标签: laraveleloquent

解决方案


使用whereHas()

return $prod = \App\Product::whereKey(2)->whereHas(
    'shipping_profiles.methods.zone.countries', function($query) {
        $query->where('countries.id', 10000);
    })->firstOrFail();

推荐阅读