Laravel:使用 unset() 后无法在预先加载中重新索引集合的数组



我有以下代码:

// 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。

最新更新