Правильный способ установить это Laravel отношение? - PullRequest
0 голосов
/ 27 января 2020

Я после небольшого логика c совета. Я создаю систему, в которой пользователи входят и регистрируют свое участие в активности. Они могут участвовать в деятельности много раз. Каков наилучший способ сделать это? Я хочу убедиться, что могу использовать eloquent с этим, а не создавать свои собственные функции.

Я воображаю ...

Пользователи:

id

Действия:

id
name

Участие:

id
user_id
activity_id
time_at_activity

Я хочу позже иметь возможность выполнять такие действия, как: $user->participations->where('activity_id', 3) например.

Каков наилучший способ установить это вверх? Я имел в виду ..

Пользователь: hasMany-> Участия

Активность: ownTo-> Участие

Участие: hasMany-> Активности & ownTo-> Пользователь

Это выглядит правильно?

Ответы [ 3 ]

2 голосов
/ 27 января 2020

enter image description here Схема пользователей может относиться к действиям через сводную таблицу, называемую участниками:

/**
 * Indicate that the model belongs to a user.
 *
 * @see \App\Model\User
 *
 * @return BelongsTo
 */
public function user()
{
    return $this->belongsTo(User::class);
}

/**
 * Indicate that the model belongs to many activity participations.
 *
 * @see \App\Model\Activity
 *
 * @return BelongsTo
 */
public function participations()
{
    return $this->belongsToMany(Activity::class, 'participations');
}

$user->participations()->attach($activity);

Возможно, вы захотите добавить взаимные отношения. Их можно разделить на признаки для повторного использования кода. ->attach(['participated_at' => now()])

1 голос
/ 27 января 2020

Схема БД enter image description here

// App\User
public function participations()
{
    return $this->hasMany('App\Participation');
} 
// You may create App\Participation Model
// App\Participation 
public function user()
{
    return $this->belongsTo('App\User');
} 

// Controller
$userParticipations = $user->participations->where('activity_id', 3);
// eager loading version
$userWithParticipations = $user->with(['participations' => function($q) { $q->where('activity_id', 3) }])->get();
1 голос
/ 27 января 2020

Вы можете использовать Соотношение «многие ко многим» .

Использовать Participation в качестве сводной таблицы. Определите отношения как

/* in User */
public function activity()
{
    return $this->belongsToMany('App\Models\Activitys','participation','user_id','activity_id')->as('participation')->withPivot('time_at_activity');
} 

/* in Activity */
public function user()
{
    return $this->belongsToMany('App\Models\Users','participation','activity_id','user_id')->as('participation')->withPivot('time_at_activity');
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...