我将此设置作为我的数据库结构已经运行得很好,但我觉得它可能会更好,但无法弄清楚如何。
事件可以有多个子事件。用户可以加入这些事件以及可选的子事件。使用这种结构,我有所有约束,但链接参加子事件参加的事件=>可以在没有主要活动参加的情况下离开子活动(这不应该是可能的,因为没有参加主活动的用户不能参加它的子活动)。
我目前正在与Laravel合作,所以看起来像这样:
用户:
活动:
子事件:
在尝试管理用户的子事件出席时出现问题。我如何在事件和子事件参与之间建立这种约束,同时保持干净利用Laravel的能力/你可以提供什么作为更好结构的建议/你们将如何做?
为了澄清,事件和子事件存储不同的东西,具有不同的属性。此外,我需要存储参加活动的信息(就像他参加现实生活中一样)和次级活动,很可能是不同的。
Edward Haber具有更好的结构,但由于我的两个数据透视表(User-Event和User-SubEvent之间的连接)存储了其他不同类型的信息,目前选择保留初始设计。
我面临的最大问题之一(两种结构都存在)是查询用户,同时使用有人参与的子事件获取有人值守的事件。试图达到这个结果:
User[]:{
...,
attending_events[]:{
...,
attending_sub_events[]:{
...
}
}
}
一直想着一个干净的解决方案几个小时,无法得到任何其他工作。不想手动编写整个SQL查询。我使用两个数据透视表的当前实现看起来像这样(结果没有嵌套,代码混乱):
$users = User::withCount(['attendingEvents' => function($query) use($eventId){
$query->where('event_id', $eventId);
}])
->with(['attendingSubEvents' => function($query) use($eventId){
$query->select('id')->whereHas('event', function($query) use($eventId){
$query->where('id', $eventId);
});
}]);
通过这种方法,我将子事件与主事件分开。 (仅查询主要参加活动计数,因为我只需要确定他是否加入)。
答案 0 :(得分:0)
此类解决方案的模式是使用Polymorphic Relationship。该解决方案只关注将User连接到Event和SubEvent - 其余的关系看起来是正确的。
<?php
class User extends Model {
public function attending() {
return $this->morphTo();
}
}
<?php
class Event extends Model {
public function attendees() {
return $this->morphMany('App\User', 'attending')
}
}
<?php
class Subevent extends Model {
public function attendees() {
return $this->morphMany('App\User', 'attending')
}
}
用户表需要以下字段:
*users*
-----
id
attending_id
attending_type
这都是未经测试的 - 但基本的想法。 (编辑:更改了参加者参加的多态方法名称)