Laravel, лучший способ сделать отношения - PullRequest
1 голос
/ 09 июля 2019

У меня есть такая проблема: некоторые пользователи (user_id) имеют доступ к отчетам (report_id), но только в течение ограниченного времени (в днях, days_count) для любого отчета, но каждый отчет может быть доступен только с определенным количеством попыток ( report_count) в течение days_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

Используя эту логику двух таблиц, как я могу использовать отношения Laravel для установления моих отношений?

Ответы [ 2 ]

2 голосов
/ 09 июля 2019

Для чего-то подобного вы должны использовать BelongsToMany отношение между User и Report, где первая таблица в вашем примере - это сводная таблица.

Я бы также предложил изменитьdays_count - это отметка времени, так как вам не нужно обновлять days_count в начале / конце каждого дня (при условии, что вы это делаете).


Затем дляполучение отчетов, к которым пользователь имеет доступ, будет выглядеть примерно так:

$reports = $user->reports()
    ->whereDate('access_until', '>=', now())
    ->where('report_count', '>=', 1)
    ->get();
1 голос
/ 09 июля 2019

Вы можете использовать отношение ToMany с дополнительными полями сводки.
Ваша модель пользователя должна иметь метод отношения к отчетам, подобным этому:

/**
 * 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');
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...