laravel - 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')
,但无法到达想要的结构。
解决方案
如果你想做这个结构。
- 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');
}
}
我想,这可能会对你有所帮助。
推荐阅读
- javascript - 如何在 EXT JS 中的分段按钮上应用样式
- java - 如何在 MacOS 上使用 Java 进行 Touch ID 身份验证
- php - 在引导卡中获取信息
- angular - 如何使用 Angular 获取 Azure 服务主体的不记名令牌?
- git - 检查 git 存储库是否在 master HEAD 后面
- mysql - 连接 mysql 中的连接
- elasticsearch - 使用 ElasticSearch 索引电子邮件 - 映射问题
- spring - Azure 服务总线 - Spring Boot 禁用自动启动 (com.microsoft.azure : azure-servicebus-spring-boot-starter)
- ruby - `*': 否定参数 (ArgumentError) Ruby
- javascript - “未捕获的错误:找不到模块'react'”不断显示