建立这种拉拉维尔关系的正确方法?

我正在寻求一些逻辑建议。我正在创建一个系统,用户可以在其中登录并注册他们对活动的参与情况。他们可以多次参加一项活动。最好的方法是什么?我想确保我可以雄辩地使用它,而不是创建自己的函数。

我正在想象...

用户:

id

活动:

id
name

参与:

id
user_id
activity_id
time_at_activity

我希望以后能够做这样的事情:例如。$user->participations->where('activity_id', 3)

设置它的最佳方法是什么?我想到了..

用户: 有多种>参与

活动: 属于>参与

参与:具有许多>活动和属于>用户

这看起来正确吗?


斯蒂芬大帝
浏览 94回答 3
3回答

慕村225694

用户架构可以通过称为参与的数据透视表与活动相关联:/** * 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()])

慕田峪9158850

数据库架构// App\Userpublic 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();

慕盖茨4494581

您可以使用多对多关系。用作数据透视表。将关系定义为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');} 
打开App,查看更多内容
随时随地看视频慕课网APP