在枢轴上使用 hasManyThrough 检索相关模型 table - Laravel 5.7
Retrieve related models using hasManyThrough on a pivot table - Laravel 5.7
我正在尝试从数据透视表 table 上检索相同类型的相关模型。
我有 2 个模型,App\Models\User
和 App\Models\Group
以及一个枢轴模型 App\Pivots\GroupUser
我的 table 具有以下结构
用户
- id
组
- id
group_user
- id
- user_id
- group_id
我目前将关系定义为
在app/Models/User.php
public function groups()
{
return $this->belongsToMany(Group::class)->using(GroupUser::class);
}
在app/Models/Group.php
public function users()
{
return $this->belongsToMany(User::class)->using(GroupUser::class);
}
在app/Pivots/GroupUser.php
public function user()
{
return $this->belongsTo(User::class);
}
public function group()
{
return $this->belongsTo(Group::class);
}
我正在尝试在我的 User
class 中定义一种关系,以访问因位于同一组中而相关的所有其他用户。调用它 friends
。到目前为止我试过这个:
app/Models/User.php
public function friends()
{
return $this->hasManyThrough(
User::class,
GroupUser::class,
'user_id',
'id'
);
}
但它最终只返回一个集合,其中只有我从中调用关系的用户。 (与 运行 collect($this);
相同
我有一个可行但不理想的解决方案。
app/Models/User.php
public function friends()
{
$friends = collect();
foreach($this->groups as $group) {
foreach($group->users as $user) {
if($friends->where('id', $user->id)->count() === 0) {
$friends->push($user);
}
}
}
return $friends;
}
有没有一种方法可以使用 hasManyThrough
或其他一些 Eloquent 函数来完成此操作?
谢谢。
您不能使用 hasManyThrough
执行此操作,因为 users
table 上没有外键将其与 [=14] 的 id
相关联=] table。您可以尝试使用现有的 belongsToMany
关系从用户转到他们的群组再到他们的朋友:
app/Models/User.php:
// create a custom attribute accessor
public function getFriendsAttribute()
{
$friends = $this->groups() // query to groups
->with(['users' => function($query) { // eager-load users from groups
$query->where('users.id', '!=', $this->id); // filter out current user, specify users.id to prevent ambiguity
}])->get()
->pluck('users')->flatten(); // massage the collection to get just the users
return $friends;
}
然后当您调用$user->friends
时,您将获得与当前用户在同一组中的用户集合。
我正在尝试从数据透视表 table 上检索相同类型的相关模型。
我有 2 个模型,App\Models\User
和 App\Models\Group
以及一个枢轴模型 App\Pivots\GroupUser
我的 table 具有以下结构
用户
- id
组
- id
group_user
- id
- user_id
- group_id
我目前将关系定义为
在app/Models/User.php
public function groups()
{
return $this->belongsToMany(Group::class)->using(GroupUser::class);
}
在app/Models/Group.php
public function users()
{
return $this->belongsToMany(User::class)->using(GroupUser::class);
}
在app/Pivots/GroupUser.php
public function user()
{
return $this->belongsTo(User::class);
}
public function group()
{
return $this->belongsTo(Group::class);
}
我正在尝试在我的 User
class 中定义一种关系,以访问因位于同一组中而相关的所有其他用户。调用它 friends
。到目前为止我试过这个:
app/Models/User.php
public function friends()
{
return $this->hasManyThrough(
User::class,
GroupUser::class,
'user_id',
'id'
);
}
但它最终只返回一个集合,其中只有我从中调用关系的用户。 (与 运行 collect($this);
我有一个可行但不理想的解决方案。
app/Models/User.php
public function friends()
{
$friends = collect();
foreach($this->groups as $group) {
foreach($group->users as $user) {
if($friends->where('id', $user->id)->count() === 0) {
$friends->push($user);
}
}
}
return $friends;
}
有没有一种方法可以使用 hasManyThrough
或其他一些 Eloquent 函数来完成此操作?
谢谢。
您不能使用 hasManyThrough
执行此操作,因为 users
table 上没有外键将其与 [=14] 的 id
相关联=] table。您可以尝试使用现有的 belongsToMany
关系从用户转到他们的群组再到他们的朋友:
app/Models/User.php:
// create a custom attribute accessor
public function getFriendsAttribute()
{
$friends = $this->groups() // query to groups
->with(['users' => function($query) { // eager-load users from groups
$query->where('users.id', '!=', $this->id); // filter out current user, specify users.id to prevent ambiguity
}])->get()
->pluck('users')->flatten(); // massage the collection to get just the users
return $friends;
}
然后当您调用$user->friends
时,您将获得与当前用户在同一组中的用户集合。