如何解决Laravel 7:使用模型连接 3 个表
我有三个不同的表:
- 用户:ID、姓名等...
- 团队:ID、creator_id 等...
- Team_Action:ID、team_id 等...
- 权限:ID、姓名等...
Team_Action 有一个带有权限的 FK (action_id),我需要该表的 name 值。 Team_Action 也有一个带有用户的 FK (user_id),我需要用户表的 name 值。
当时,我只能访问 ID 而不能访问名称。
我想知道是否有任何方法可以仅使用 Laravel 的模型来实现以下目标:
@foreach($team->teamAction as $tmdata)
<tr>
<td>
$team->teamMember->name
</td>
<td>
$team->teamAction->name
</td>
</tr>
@endforeach
我的团队模型:
//Infinite users belong to a team
public function teamMembers() {
return $this->hasMany(TeamsMembers::class,'team_id','id');
}
//Infinite actions per team
public function teamAction(){
return $this->hasMany(TeamsAction::class);
}
团队行动
public function team(){
return $this->belongsTo(Team::class);
}
权限
public function teamAction(){
return $this->belongsTo(TeamsAction::class,'action_id');}
团队成员
public function team() {
return $this->belongsTo(Team::class,'id');
}
public function teamMember(){
return $this->hasMany(User::class,'id','user_id');
}
我的控制器代码:
$teamID = $request->route('id');
$team = Team::where('id',$teamID)->get()->first();
foreach ($team->teamAction as $tta) {
$allTeamActions = Permission::where('id',$tta->action_id)->get();
}
foreach ($team->teamMembers as $ttm){
$allTeamMembers = User::where('id',$ttm->user_id)->get();
}
我的目标是这样的
$allTeamActions = Permission::where('id',$team->teamAction[0]->action_id->name)->get();
编辑: 让我放一些视觉效果让它更清楚:
有没有办法通过 eloquent 模型检索那些模型的 FK 到我正在使用的模型的名称值? 1
场景如下: 每个成员都属于一个团队。 (桌队:ID,creator_id) 该团队在名为 team_members (user_id,team_id) 的另一个表中有多个成员。 一个团队将多个操作存储在另一个名为 team_actions 的表中,该表存储来自另一个名为权限的表 (team_id,action_id_user_id) 的 FK 值。 一个用户表存储了用户的所有实际信息(也就是我想使用的他们的名字)
我想创建一个包含所有信息的视图表。 也就是说,我正在尝试通过 Teams 模型访问以下信息: 团队用户(他们的名字来自users表,用户的ID存储在team_members和team_actions中)
团队用户动作(来自权限表的动作名称,动作ID保存在team_actions中)
解决方法
根据提供的描述,team_actions
表看起来像一个透视表或联结表,在团队 用户和团队 权限之间形成多对多关系。基于这个结论,您可以定义一个与 hasMany()
表的 team_actions
关系,这将是一个 TeamMemberAction
模型
class TeamMemberAction extends Model
{
protected $table = 'team_actions';
public function member()
{
return $this->belongsTo(User::class,'id','user_id');
}
public function team()
{
return $this->belongsTo(Team::class,'team_id');
}
public function action()
{
return $this->belongsTo(Permission::class,'action_id');
}
}
class Team extends Model
{
public function member_actions()
{
return $this->hasMany(TeamMemberAction::class,'team_id');
}
}
所以我想不需要额外的 team_members
表来获取团队成员列表。
现在有了这个新的映射,你可以得到成员和动作
$team = Team:with(['member_actions.member','member_actions.action'])->find(1);
对于成员名称,您需要循环 $team->member_action
集合,每个集合都有一个成员键,其中包含来自用户表的成员详细信息,对于诸如
{
id:1
name:"Team One"
member_actions: [{
id: 3,member: {
id: 7
name: "User name"
},action: {
id: 11,name: "Action name"
}
},{
id: 5
member: {
id: 9,name: "User name"
},action: {
id: 13,name: "Action name"
}
}]
}
如果你直接想要团队成员,那么你定义属于团队模型中的许多关系
class Team extends Model
{
public function members()
{
return $this->belongsToMany(User::class,'team_actions','team_id','user_id');
}
public function actions()
{
return $this->belongsToMany(Permission::class,'action_id');
}
}
然后你可以将两个关系加载为
$team = Team:with(['members','actions'])->find(1);
{
id:1
name:"Team One"
members: [{
id: 3,name: "User name"
},{
id: 5,name: "User name"
}],actions: [{
id: 7,name: "Action name"
},{
id: 9,name: "Action name"
}]
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。