首页 > 解决方案 > Laravel 嵌套:事件(带时间线)和子事件(带时间线)

问题描述

我有可以有子事件的事件,每个事件都可以有时间线项目。
寻找一种获取嵌套集合的方法。

对于事件,我可以使用时间线项目获取它们:

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

对于事件,我可以使用嵌套的子事件:

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

我怎样才能将两者结合起来?

预期的最终结果:
每个事件包括
1) 该事件的时间线项目,以及
2) 该事件的子事件(并且对于每个子事件:该子事件的时间线项目)。

例如:

- 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

也可以得到结果并使用集合分组。A la App\Event::with('timelines')->get()->groupBy('parent_id'),但无法到达想要的结构。

标签: laraveleloquent

解决方案


如果你想做这个结构。

- 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');
    }
}

我想,这可能会对你有所帮助。


推荐阅读