Laravel eloquent 关系,3 种加入方式

Laravel eloquent relationships, 3 way join

我有3个table(这里简化)

用户

身份证、姓名、电子邮件

团队

身份证、姓名

team_user

team_id,user_id

我想向 return 用户 ID 所属的所有团队以及该团队中还有哪些其他成员发送 API 查询。我不想 return 只是 userIds,而是想用他们的实际用户数据填充数组,例如姓名和电子邮件。

Route::get('/user/{id}/teams/', 'UserController@getTeams');

User.php(型号)

class User extends Authenticatable
{
    use HasApiTokens, Notifiable;

    public function teams()
    {
        return $this->belongsToMany('App\Team', 'team_user', 'team_id', 'user_id');
    }
}

Team.php(型号)

class Team extends Model
{    
    public function users()
    {
        return $this->belongsToMany('App\User', 'team_user', 'team_id', 'user_id');
    }
}

团队User.php(模特)

class TeamMember extends Model
{    
    public function user()
    {
        return $this->hasOne('App\User');
    }

    public function team()
    {
        return $this->hasOne('App\Team');
    }
}

UserController.php

class UserController extends Controller
{
    public function getTeams($userId) {

        return User::find($teamId)->teams()->get();
    }
}

这个returns:

[
    {
        "id": 6,
        "name": "P12",
        "location": "Newbury",
        "owner": 6,
        "active": 1,
        "created_at": "2017-12-20 10:18:00",
        "updated_at": "2017-12-20 10:18:00",
        "pivot": {
            "team_id": 6,
            "user_id": 6
        }
    },
    {
        "id": 4,
        "name": "fwffewfffffff",
        "location": "ffffffff",
        "owner": 4,
        "active": 1,
        "created_at": "2017-12-19 19:56:27",
        "updated_at": "2017-12-19 19:56:27",
        "pivot": {
            "team_id": 6,
            "user_id": 4
        }
    }
]

不过,我还想包括这两个团队中每个团队的其他用户的列表。使用他们的姓名和电子邮件(来自用户 table),而不仅仅是 user_ids.

这是否可以不进行进一步的单独查询?

尝试使用 with() 从不同的表中检索字段,例如

class UserController extends Controller {
    public function getTeams($userId) {
         return User::find($userId)->with('teams')->get();
         // return User::find($userId)->teams()->get();
    }
}

如果您想 select 来自 team_members 数据库的特定列,您可以在 with 中添加函数,例如

class UserController extends Controller {
    public function getTeams($userId) {
         return User::find($userId)->with(['teams' => function($query) {
             $query->select('id', 'name');
         }])->get();
    }
}

现在我已经用

解决了这个问题
class UserController extends Controller
{
    public function getTeams($userId) {

        $teamWithMembers = [];

        $teams = User::find($userId)->teams()->get();

        foreach($teams as $team) {
            $team->members = Team::find($team->id)->users()->get();
            $teamWithMembers[] = $team;
        }

        return $teamWithMembers;
    }
}

您将能够立即加载关系并将它们附加到模型。

通过使用圆点表示法 teams.users,输出将包括所有团队的所有用户,这些用户属于 ID 为 $userId 的用户。

我添加了 findOrFail 以确保在找不到用户时它会 return 404。

class UserController extends Controller
{
    public function getTeams($userId)       
    {
        return User::with('teams.users')->findOrFail($userId);
    }
}

这将 return 用户并附加关系。

如果你只想 return 个团队,你可以这样做:

class UserController extends Controller
{
    public function getTeams($userId)       
    {
        $user = User::with('teams.users')->findOrFail($userId);

        // $user->teams will hold a collection of teams with their users
        return $user->teams;
    }
}