Laravel вложенные: события (с временными шкалами) и с вложенными событиями (с временными шкалами) - PullRequest
1 голос
/ 07 января 2020

У меня есть События, которые могут иметь вложенные события, и каждое событие может иметь элементы временной шкалы.
В поисках способа получения вложенной коллекции.

Для событий я могу получить их с помощью элементов временной шкалы:

App\Event::with('timelines')->get()

Для событий я могу их с вложенными вложенными событиями:

App\Event::doesntHave('parent')->with('subEvents')->get()

Как я могу объединить два?

Ожидаемый конечный результат:
каждое событие включает
1) элементы шкалы времени для этого события и
2) вложенные события для этого события (и для каждого вложенного события: элементы шкалы времени для этого события subevent).

Например:

- Event 1
  - Timeline: 1, 3, 5
  - subEvents:
    - 2, Timeline: 2, 6
    - 3, Timeline: 7, 8
- Event 4
  - Timeline: 9
- Event 5
  - subEvents:
    - 6, Timeline: 10

Также можно получить результаты и использовать группировку коллекций. А-ля App\Event::with('timelines')->get()->groupBy('parent_id'), но возникают проблемы с поиском нужной структуры.

1 Ответ

0 голосов
/ 07 января 2020

Если вы хотите создать эту структуру.

- Event 1
  - Timeline: 1, 3, 5
  - subEvents:
    - 2, Timeline: 2, 6
    - 3, Timeline: 7, 8
- Event 4
  - Timeline: 9
- Event 5
  - subEvents:
    - 6, Timeline: 10

Вы можете получить временные шкалы из модели Event, а также subEvents с их временными шкалами. Для этого вы можете создать функцию для subEvents поиска.

App\Event::with(['timelines','subEvents' => function($q){
   $q->with('timelines');
])->get();

или этого , если вам не нужно делать какие-либо запросы в subEvents.

App\Event::with('timelines','subEvents.timelines')->get();

Убедитесь, что отношения вашей Модели должны быть такими:

//Event.php
class Event extends Model
{
    public function timelines(){
        return $this->hasMany('App\Timeline');
    }

    public function subEvents(){
        return $this->hasMany('App\SubEvent');
    }
}

//SubEvent.php
class SubEvent extends Model
{
    public function timelines(){
        return $this->hasMany('App\Timeline');
    }
}

Я думаю, это может вам немного помочь.

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