【问题标题】:Laravel 7: Connect 3 tables using modelsLaravel 7:使用模型连接 3 个表
【发布时间】:2021-05-18 10:49:29
【问题描述】:

我有三个不同的表:

  • 用户: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,'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();

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

有没有办法通过 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 中)

【问题讨论】:

  • 我想我对我的哪一张桌子被认为是“枢轴”感到困惑。此外,当我尝试 allTeamActions 而不指定键值(在我的示例中为 0)时,我什么也得不到。
  • 这不是我的情况。一个团队有许多团队操作,但团队操作属于团队
  • 您的问题仍然不清楚并且非常令人困惑,您提到的表格与否不匹配。模型,你能添加你的场景的简短描述
  • 你是对的。我会尝试改写我的问题
  • @MKhalidJunaid 请看我改写的问题

标签: php mysql laravel laravel-7 laravel-models


【解决方案1】:

根据提供的描述team_actions 表看起来像一个透视表或联结表,它在团队 用户和团队 权限之间形成多对多关系。基于此结论,您可以定义与team_actions 表的hasMany() 关系,该表将是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-&gt;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, 'team_actions', 'team_id', '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"
    }]
}

【讨论】:

  • 我几乎可以简单地选择连接用户和操作表的 member_actions 表。
  • @GeorgeG 我没明白你的意思,有什么遗漏吗?还是有什么问题?
猜你喜欢
  • 1970-01-01
  • 2016-03-29
  • 2018-08-27
  • 1970-01-01
  • 2015-09-06
  • 2015-03-02
  • 2020-06-24
  • 2017-03-11
  • 1970-01-01
相关资源
最近更新 更多