Laravel 7:使用模型连接 3 个表

如何解决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();

编辑: 让我放一些视觉效果让它更清楚:

enter image description here

有没有办法通过 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?