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;
}
}
我有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;
}
}