我有这个问题:某些用户(user_id)可以访问报告(report_id),但是任何报告只能在有限的时间内(以天,days_count为单位),但是每个报告只能访问一定次数的尝试( report_count)。
在一个表中,逻辑将是这样:
One Table
---------
id - user_id - report_id - report_count - days_count
1 - 5 - 1 - 5 - 7
2 - 5 - 2 - 3 - 7
3 - 3 - 1 - 4 - 10
第一行将显示为:“具有user_id 5的用户有权访问report_id 1,他还有5个访问权,还有7天的访问权限” 等
我当时正在考虑制作2张这样的桌子:
Table 1
---------
id - user_id - report_id - report_count
1 - 5 - 1 - 5
2 - 5 - 2 - 3
3 - 3 - 1 - 4
Table 2
---------
id - user_id - days_count
1 - 5 - 7
2 - 2 - 10
使用2个表的逻辑,如何使用Laravel关系建立我的关系?
答案 0 :(得分:2)
对于这样的事情,您可以在User
和Report
之间使用BelongsToMany关系,其中示例中的第一个表是数据透视表。
我还建议您将days_count
更改为时间戳,因为这样您就不必在每天的开始/结束时更新days_count
(假设您正在这样做)
然后,获取用户有权访问的报告的过程类似于:
$reports = $user->reports()
->whereDate('access_until', '>=', now())
->where('report_count', '>=', 1)
->get();
答案 1 :(得分:1)
您可以将belongsToMany relation与其他枢轴字段一起使用。
您的用户模型应具有用于报告的关联方法,如下所示:
/**
* User belongs to many (many-to-many) Reports.
*
* @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
*/
public function reports()
{
// belongsToMany(RelatedModel, pivotTable, thisKeyOnPivot = report_id, otherKeyOnPivot = user_id)
return $this->belongsToMany(Report::class)->withPivot('report_count', 'days_count');
}
然后,报告模型将具有以下对应对象
/**
* Report belongs to many (many-to-many) Users.
*
* @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
*/
public function users()
{
// belongsToMany(RelatedModel, pivotTable, thisKeyOnPivot = user_id, otherKeyOnPivot = report_id)
return $this->belongsToMany(User::class)->withPivot('report_count', 'days_count');
}