Laravel 5.0 зацикливается на предметах отношений в клинке - PullRequest
0 голосов
/ 10 мая 2019

У меня есть отношение один ко многим, как это:

1 блок имеет много blockItems

Я получаю все блоки в моем контроллере следующим образом:

$allBlocks = Block::all();

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

@foreach($allBlocks as $block)
    @foreach($block->blockItems as $item)
        {{ $item->item_type }}
    @endforeach
@endforeach

Теперь моя проблема в моем блейде, у меня есть все блоки, и я хочу перебрать blockItemsблок с идентификатором 2. Я пробовал это:

@foreach($allBlocks->where('id', 2)->blockItems as $item)
    {{ $item->item_type}}
@endforeach

это, к сожалению, ничего не показывает.

Ответы [ 4 ]

2 голосов
/ 10 мая 2019

Вы применяете пункт where в коллекции.Вам нужно запустить метод get или first для коллекции, чтобы получить элементы из коллекции в соответствии с предложением where.

first получит только один элемент, а затем вы сможете получить доступ к blockItems отношение.

@foreach($allBlocks->where('id', 2)->first()->blockItems as $item)
    {{ $item->item_type}}
@endforeach
1 голос
/ 10 мая 2019

Вы должны изменить

allBlocks->where('id', 2)->blockItems as $item

на

allBlocks->where('id', 2)->get() as $item->blockItems

Вы просто забыли выполнить запрос и вызвать blockItems для элементов

Если ваш запрос тольковозвращает 1 результат (как и ожидалось при выборе по идентификатору), который вы можете использовать first(), поэтому вам не нужно зацикливать результат (ы).

0 голосов
/ 10 мая 2019

1001 * попробовать *

@foreach($allBlocks as $block)
    @if($block->id==2)
         @foreach($block->blockItems as $item)
               {{ $item->item_type }}
         @endforeach
    @endif
@endforeach
0 голосов
/ 10 мая 2019

all возвращает коллекцию, содержащую Blocks

Я не думаю, что вам нужны все существующие блоки в базе данных, но допустим, что вы хотите.

Вам необходимо отфильтровать Block, который вы хотите, и для каждого его элемента. Вы можете сделать несколько подходов для фильтрации коллекции (вам не понадобится, если у вас есть точные данные для работы, запрос выполняется быстрее, чем обычно с объектами)

$collection->firstWhere('id', '=', 2);

Итак, ваш код должен выглядеть примерно так:

@foreach($allBlocks->firstWhere('id', '=', 2)->blockItems as $item)
    {{ $item->item_type}}
@endforeach

https://laravel.com/api/5.8/Illuminate/Database/Eloquent/Model.html#method_all https://laravel.com/docs/5.8/collections#method-first-where

Редактировать: Поскольку это Laravel 5.0, вам нужно применить условие where

https://laravel.com/api/5.0/Illuminate/Database/Eloquent/Collection.html#method_where

Обратите внимание, что он по-прежнему предоставляет вам коллекцию в соответствии с документами, но, предполагая, что ваш идентификатор уникален, вы можете использовать first().

$collection->where('id', '=', 2); // will result in a filtered collection, to which you can apply first()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...