Как отобразить Laravel данные о взаимоотношениях в Blade View при использовании groupBy () в запросе - PullRequest
0 голосов
/ 17 февраля 2020

Я создаю и инвентаризирую систему для основных c деталей, которая обеспечивает покрытие для нескольких компаний. Таким образом, моя таблица inventory содержит информацию о деталях, такую ​​как part_number и description, а также внешние ключи location_id в таблицу locations. У меня есть несколько складских предметов с одним и тем же номером детали, но в каждом месте у меня разные уровни запасов. Я хочу сгруппировать инвентарь по местоположению, а затем перечислить весь инвентарь в этом месте, прежде чем перебирать другие места и делать то же самое.

Вот что у меня в контроллере:

$inventory = Inventory::where('part_number', '12345')->get();

    // dd($inventory);

$inventory_grouped_by_location = $inventory->groupBy('location_id');

    // dd($inventory_grouped_by_location);

return view('inventory.show', compact('inventory_grouped_by_location');

Вот то, что у меня есть в моей модели инвентаризации:

public function location()
{
    return $this->belongsTo(Location::class);
}

Вот то, что у меня есть в моей модели местоположения:

public function parts_inventory()
{
    return $this->hasMany(Inventory::class);
}

Вот то, что я пробовал в мой взгляд:

@foreach($inventory_grouped_by_location as $location)

<p>Location: {{ $location->name }}</p>

    @foreach($location as $inventory)

        <p>Part Number: {{ $inventory->part_number }}</p>

    @endforeach

@endforeach

Вышеприведенный код выдает ошибку, потому что я пытаюсь получить доступ к расположению, но у меня только location->id из таблицы инвентаря. Я пытался получить доступ к таким отношениям $location[$key]->name, но без радости.

1 Ответ

0 голосов
/ 17 февраля 2020

В вашем контроллере замените этот запрос

$inventory_grouped_by_location = $inventory->groupBy('location_id');

на

$inventory_grouped_by_location = Inventory::where('part_number', '12345')->with('location')->groupBy('location_id')->get();


В вашем блейде вы можете сделать что-то вроде этого:

@foreach($inventory_grouped_by_location as $inventory)

<p>Location: {{ $inventory->location->name }}</p>

    <p>Part Number: {{ $inventory->part_number }}</p>

@endforeach

Вы не можете l oop через $inventory снова, так как вы уже находитесь в индексе коллекции $inventory_grouped_by_location.


Если вы хотите сделать вложенный l oop как указано в вашем вопросе, вам, вероятно, вообще не нужен groupBy().

В методе вашего контроллера:

$locations = Location::all();
$inventory = Inventory::where('part_number', 123456)->get();

А в вашем блейде:

@foreach($locations as $location)

<p>Location: {{ $location->name }}</p>

    @foreach($inventory as $item)
        @if($item->location_id == $location->id)
        <p>Part Number: {{ $item->part_number }}</p>
        @endif
    @endforeach

@endforeach

Надеюсь, это поможет!

...