我有以下代码:
// User.php
public function groups() {
return $this->belongsToMany(
Group::class,
'group_user',
'user_id',
'group_id',
'id'
);
}
// Group.php
public function users() {
return $this->belongsToMany(
User::class,
'group_class',
'group_id',
'user_id',
'id'
);
}
并且在routes/web.php
中
Route::get('/test', function () {
$me = AppUser::first();
$group = AppGroup::with('users')->first();
foreach ($group->users as $user_index => $user) {
// Show all users (a.k.a members) of this group, except myself
if ($user->id == $me->id) {
unset($group->users[$user_index]);
}
}
return $group;
}):
结果:
{
"id": 1,
"name": "ABC Group",
"users": { // This should be array right?
"1": { // This should be start with 0
"id": 2,
"name": "...",
"email": "...",
},
"2": { // This should be 1
"id": 3,
"name": "...",
"email": "...",
}
}
}
我尝试过的:
#1将
values()
放入foreach
循环的末尾,如:foreach ($group->users as $user_index => $user) { // Show all users (a.k.a members) of this group, except myself if ($user->id == $me->id) { unset($group->users[$user_index]); } $group->users->values(); // Not working }
#2将
values()
放在foreach
循环之后,如:Route::get('/test', function () { $me = AppUser::first(); $group = AppGroup::with('users')->first(); foreach ($group->users as $user_index => $user) { // Show all users (a.k.a members) of this group, except myself if ($user->id == $me->id) { unset($group->users[$user_index]); } } $group->users->values(); // Still not working return $group; }):
预期结果:
{
"id": 1,
"name": "ABC Group",
"users": [ // Array
{ // index 0
"id": 2,
"name": "...",
"email": "...",
},
{ // index 1
"id": 3,
"name": "...",
"email": "...",
}
]
}
Q:使用
unset()
后,如何在急切加载中重新索引集合数组?
提前感谢
您在这里有一些可以帮助您的东西。
首先,您的查询返回一个附加到单个模型Group
的Laravel用户集合。Laravel在背景中有一点魔力,它也允许数组表示法,但可能最容易将其视为一个集合。在某些情况下,您可以使用Laravel的toArray()
方法将其转换为数组,例如:
$userArray = $group->users->toArray();
要删除索引,或者在本例中从Group
的用户中删除user
,请查看forget((方法,该方法适用于collection
对象。
然而,我想你可能希望从相反的角度来看。。。在单个查询中提取不需要的索引,而不必在事后循环遍历集合。像这样的东西可能对你有价值:
$me = AppUser::first();
$group = AppGroup::with(['users' => function($query) use($me){
$query->where('users.id', '!=', $me->id);
}])->first();
此查询将从数据库中的集合中删除不需要的用户,从而消除对附加代码的需要,我认为这就是您所追求的。
HTH。