Красноречивый - проверьте, существует ли идентификатор в отдаленном отношении - PullRequest
0 голосов
/ 12 октября 2018

Мне нужно проверить, существует ли идентификатор страны в отдаленном отношении к продукту.Мне нужен только истинный или ложный результат.Я не понял, как поставить запрос.Различные соотношения определены в каждой модели:

Продукт - принадлежит toMany ShippingProfile

ShippingProfile - hasMany Methods

Метод - принадлежит To ShippingZone

ShippingZone - принадлежит ToMany Страны

Итак, если у меня есть идентификатор продукта 2 и идентификатор страны 5, я хочу узнать, доступен ли идентификатор страны в какой-либо зоне в рамках любого из методов, относящихся к профилю продукта.(на самом деле это только один профиль для каждого продукта, но он определен как ownToMany с сводной таблицей).

Я попытался получить доступ к странам в качестве первого шага, но я не могу получить доступ к нему с помощьюэтот синтаксис:

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

Я получаю сообщение об ошибке: "Call to undefined method Illuminate\\Database\\Query\\Builder::methods()

(хотя методы () правильно определены в shippingProfiles).

Edit2 :

Используя «с», я могу выполнить проверку «где» для стран, но если я предоставлю несуществующую страну, это не даст сбоя - он просто вернет продукт со свойствами изона с пустым массивом стран:

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

Так что, если вы можете посоветовать любой другой метод, который вернет либо true / false, либо вернет зону или null, это то, что я ищу ..

1 Ответ

0 голосов
/ 12 октября 2018

Использование whereHas():

return $prod = \App\Product::whereKey(2)->whereHas(
    'shipping_profiles.methods.zone.countries', function($query) {
        $query->where('countries.id', 10000);
    })->firstOrFail();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...