Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel 7:使用模型连接3个表_Php_Mysql_Laravel_Laravel 7_Laravel Models - Fatal编程技术网

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、名称等
Team_Action有一个FK(Action_id)和perimmission,我需要该表的名称值。 Team_Action还有一个FK(user_id),其中的用户需要Users表的名称

当时,我只能访问ID,不能访问名称

我想知道是否有任何方法可以通过仅使用Laravel的模型来实现以下目标:

@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"
    }]
}