Php Laravel 7:使用模型连接3个表
我有三张不同的桌子:Php Laravel 7:使用模型连接3个表,php,mysql,laravel,laravel-7,laravel-models,Php,Mysql,Laravel,Laravel 7,Laravel Models,我有三张不同的桌子: 用户:ID、名称等 团队:ID、创建者ID等 团队行动:ID、团队ID等 权限:ID、名称等 Team_Action有一个FK(Action_id)和perimmission,我需要该表的名称值。 Team_Action还有一个FK(user_id),其中的用户需要Users表的名称值 当时,我只能访问ID,不能访问名称 我想知道是否有任何方法可以通过仅使用Laravel的模型来实现以下目标: @foreach($team->teamAction as $tmda
- 用户:ID、名称等
- 团队:ID、创建者ID等
- 团队行动:ID、团队ID等
- 权限:ID、名称等
@foreach($team->teamAction as $tmdata)
<tr>
<td>
$team->teamMember->name
</td>
<td>
$team->teamAction->name
</td>
</tr>
@endforeach
团队行动
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,'team_id','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();
编辑:
让我用一些视觉效果让它更清楚:
是否有一种方法可以通过雄辩的模型检索那些模型的名称值,这些名称值是我使用的模型的FK值?
情况如下:
每个成员都属于一个团队。(表格团队:ID、创建者ID)
该团队在另一个名为team_members(user_id,team_id)的表中有多个成员。
一个团队有多个操作存储在另一个名为team_actions的表中,该表存储来自另一个名为permissions的表(team_id、action_id_user_id)的FK值。
用户表存储用户的所有实际信息(即我想使用的用户名称)
我想创建一个包含所有这些信息的视图表。
也就是说,我尝试通过团队模型访问以下信息:
团队用户(他们的名字来自用户表,用户的ID存储在团队成员和团队行动中)
团队用户操作(操作的名称来自权限表,操作的ID存储在团队操作中)根据提供的描述
团队操作
表看起来像一个枢轴或连接表,在团队用户和团队权限之间形成多对多关系。基于此结论,您可以定义一个hasMany()
与team\u 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, 'id', 'team_id');
}
public function action()
{
return $this->belongsTo(Permission::class, 'id', 'action_id');
}
}
class Team extends Model
{
public function member_actions()
{
return $this->hasMany(TeamMemberAction::class, 'id', 'team_id');
}
}
因此,我想不需要额外的
team_members
表来获取团队成员列表
现在,有了这个新映射,您可以获得如下所示的成员和操作
$team = Team:with(['member_actions.member','member_actions.action'])->find(1);
对于成员名称,您需要循环
$team->member\u 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, 'team_actions', 'team_id', 'action_id');
}
}
然后,您可以将这两个关系作为
$team = Team:with(['members','actions'])->find(1);
我想我对我的哪一张桌子被认为是“支点”感到困惑。另外,当我在没有指定键值(在我的示例中为0)的情况下尝试所有TeamActions时,我没有得到任何回报。在我的示例中,情况并非如此。一个团队有很多团队行动,但团队行动属于团队你的问题仍然不清楚,非常混乱。你提到的表格与模型数量不匹配,你能添加一个场景的简要描述吗?你是对的。我将尝试重新表述我的观点question@MKhalidJunaid请看我重新表述的问题,我几乎可以简单地选择连接用户和操作表的member_actions表。@geogeg我不明白你的意思,有什么遗漏吗?还有什么问题吗?
$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"
}]
}