建立这种 Laravel 关系的正确方法?
Correct way to set up this Laravel relationship?
我正在寻求一些逻辑建议。我正在创建一个系统,用户可以在 activity 上登录并注册他们的参与。他们可以多次参加 activity。做这个的最好方式是什么?我想确保我可以使用 eloquent 而不是创建我自己的函数。
我在想象...
用户:
id
Activitys:
id
name
参与人数:
id
user_id
activity_id
time_at_activity
我希望以后能够做这样的事情:
$user->participations->where('activity_id', 3)
例如。
最好的设置方法是什么?我想到了..
用户:有很多->参与
Activity:所属->参与
参与:hasMany->Activitys & belongsTo->User
这看起来正确吗?
您可以使用 Many-to-Many 关系。
使用 Participation
作为你的支点 table。将关系定义为
/* 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');
}
用户模式可以通过称为参与的枢轴 table 与活动相关:
/**
* 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()])
数据库架构
// 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();
我正在寻求一些逻辑建议。我正在创建一个系统,用户可以在 activity 上登录并注册他们的参与。他们可以多次参加 activity。做这个的最好方式是什么?我想确保我可以使用 eloquent 而不是创建我自己的函数。
我在想象...
用户:
id
Activitys:
id
name
参与人数:
id
user_id
activity_id
time_at_activity
我希望以后能够做这样的事情:
$user->participations->where('activity_id', 3)
例如。
最好的设置方法是什么?我想到了..
用户:有很多->参与
Activity:所属->参与
参与:hasMany->Activitys & belongsTo->User
这看起来正确吗?
您可以使用 Many-to-Many 关系。
使用 Participation
作为你的支点 table。将关系定义为
/* 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');
}
/**
* 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()])
数据库架构
// 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();