Laravel проходит через красноречивые модели с глубокими отношениями - PullRequest
1 голос
/ 22 апреля 2019

Цикл ниже работает:

foreach($this->friends as $friend)
{
    foreach($friend->mailings as $mailing)
    {
        foreach($mailing->orders as $order)
        {
            $num_orders++;
        }

    }
}

Но хотел бы сделать

foreach($this->friends->mailings->orders as $order)
{
    $num_orders++;
}

но когда я получаю эту ошибку Property [mailings] does not exist on this collection instance.

Отношения между моделями установлены правильно (имеет много ... и т.д.)

1 Ответ

1 голос
/ 22 апреля 2019

Редактировать: я нашел это!Ярек - великий писатель для Eloquent, и я хотел посмотреть, есть ли у него хитрость для этого.Как всегда он делает.:)

$this->load(['friends.mailings.orders' => function($q) use(&$orders){
    $orders = $q->get();
}]);

Теперь, если вы dd($orders), у вас будет список всех заказов от рассылок от друзей, относящихся к $this, так что теперь вы можете просматривать эту информацию, чтобы получить то, что вы хотите.

foreach($orders as $order){
    $num_orders++
}

На его сайте есть предупреждение о сертификате, но здесь я получил вышеупомянутое.https://softonsofa.com/laravel-querying-any-level-far-relations-with-simple-trick/

Пожалуйста, не обращайте внимания на нижеследующее, так как оно больше не нужно, но я держу его здесь для ясности и потому, что оно было принято в качестве ответа.

Вы можете использовать метод сбора each() для очистки ваших циклов.Поскольку существует отношение «многие ко многим», вы не можете получить доступ к отношениям связанных моделей, если не выполните итерацию по ним или не укажите, какой связанный элемент вы хотите.См. Ниже:

$this->friends->each(function($friend, $key){
    $friend->each(function($mailing, $key2){
        $mailing->orders->each(function($orders, $key3){
            $num_orders++;
        })  
    });
})

https://laravel.com/docs/5.8/collections#method-each

Существует также метод построения запросов withCount(), который вы можете рассмотреть.Кажется, ему не нравятся вложенные отношения с использованием обычной точечной нотации, но я недостаточно использовал ее, чтобы сказать, можно ли ее использовать здесь.Я наткнулся на Laravel 5.3 с вложенным отношениемCount () , глядя на часть withCount().Похоже, это возможно, но вам придется изменить свои отношения на hasManyThrough().Это должно быть хорошее место для начала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...