Как создать коллекцию (или массив) со списком всех родителей и их дочерних элементов для передачи в представление

#php #arrays #laravel #eloquent

#php #массивы #laravel #красноречивый

Вопрос:

Я совсем новичок в Laravel. Я знаю, как я мог бы это сделать, но не уверен, что это лучший метод. У меня есть система элементов, называемых «Потоками». Каждый из них принадлежит определенной «FlowCategory». Я хотел бы получить все элементы «FlowCategory», а затем связанные с ними дочерние элементы («потоки») с помощью контроллера и передать это в представление.

В нужном мне представлении будет показан список каждой категории потоков и связанных с ней потоков.

Я настроил Eloquent, и у двух элементов есть взаимосвязь. Я создал цикл foreach в контроллере и создал массив вручную, но я уверен, что он правильный.

        foreach ($cats as $cat) {
           $catid = $cat->id;
           $flows[$catid] = AppFlowCategory::find($catid)->flows;
       }
  

Комментарии:

1. Если категория принадлежит категории потока, то вам следует взглянуть на Eloquent relationship здесь

2. Спасибо за ваш комментарий. Я уже установил красноречивую взаимосвязь между категориями и самими потоками. Это работает хорошо. Но я не уверен, как передать данные в представление с каждой категорией и связанными с ней элементами

Ответ №1:

Хорошо, может быть, вам стоит сделать что-то подобное. Но просто для обновления концепции:

  • Потоки belongsTo Категория потока
  • Категория потока hasMany Flows.

Ваши модели:

Категория потока:

 public function flows()
{
    return $this->belongsTo('AppFlow', 'category_id');
}
  

Поток:

 public function flowCategory()
{
    return $this->hasMany('AppFlowCategory');
}
  

То есть, если вы хотите отобразить в своем представлении все категории потоков с их соответствующими элементами, вы можете поступить следующим образом:

FooController.php

 public function bar() {
  // "with" is to avoid N 1 query problem
  $flowsCategories = FlowCategory::with('flows')->get();

  return view('yourview', compact('flowsCategories'));
}
  

И затем, чтобы отобразить items в вашем представлении, для каждого category вы можете сделать вот так:

 @foreach($flowsCategories as $flowCategory)
  @foreach($flowCategory->flows as $flow) 
     Flow: {{ $flow->name }} – Flow Category: {{ $flowCategory->name }}
  @endforeach
@endforeach