我有 3 个模型,User、Alert和Category。
User和之间的关系Category是多对多的。
Alert和之间的关系Category也是多对多的。
AUser应该只接收Alert属于已选择的相同Category的User。例如,如果将UserTravel和Food作为,Category那么我只想Alert将Travel和Food显示给User。
一旦User查看了Alert,Alert则应将该特定 的 标记为“已读” User。
目前我正在这样做:
Category.php
public function alerts()
{
return $this->belongsToMany('App\Alert')->withTimestamps();
}
public function users()
{
return $this->belongsToMany('App\User')->withTimestamps();
}
User.php
public function alerts()
{
return $this->belongsToMany('App\Category')->withTimestamps();
}
public function categories()
{
return $this->belongsToMany('App\Alert')->withTimestamps()->withPivot('read');
}
Alert.php
public function users()
{
return $this->belongsToMany('App\User')->withTimestamps()->withPivot('read');
}
public function categories()
{
return $this->belongsToMany('App\Category')->withTimestamps();
}
在当前的实现中,有 3 个数据透视表:alert_category、alert_user和category_user。alert_user表有一个名为的额外字段read,它基本上确定用户是否已阅读警报。IE
alert_user table
alert_id
user_id
read (holds 0 or 1)
这个实现有很多缺陷,我认为它根本不起作用,因为 newUser不会收到Alert在注册之前创建的,如果Alert更改Category,它不会被更新。当然,它可以通过显式更新每个表来完成,但我不认为这是有效的,也不是架构。
我正在考虑将整个事情重构为多对多的多态关系。但是,我如何确定是否User已阅读特定内容Alert?我应该在哪里放置一个read字段?
你怎么看?我对任何想法持开放态度。任何帮助将不胜感激。
编辑:
总而言之,我想我想做的是,而不是User订阅Alert,它应该订阅Category. 因此,基本上User将收到所有Alert相同的Category。
尚方宝剑之说
隔江千里