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

Laravel: Cannot reindex collection's array in eager loading after using 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 = App\User::first();

    $group = App\Group::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": "...",
        }
    }
}

我尝试过的:

预期结果:

{
    "id": 1,
    "name": "ABC Group",
    "users": [ // Array
        { // index 0
            "id": 2,
            "name": "...",
            "email": "...",
        },
        { // index 1
            "id": 3,
            "name": "...",
            "email": "...",
        }
    ]
}

Q: How to reindex collection array in eager loading after using unset()?

提前致谢

这里有一些东西要打开,可能会对你有所帮助。

首先,您的查询 returns Laravel collection 个用户附加到单一模型 Group。 Laravel 在后台也有一点魔力,也允许数组表示法,但可能最容易将其视为您的目的集合。在某些情况下,您可以使用 Laravel 的 toArray() 方法将其转换为数组,例如:

$userArray = $group->users->toArray();

要删除索引,或者在本例中是 Group 用户的 user,请查看 forget() 方法,该方法适用于 collection对象。

但是,我认为您可能希望从相反的方向来解决这个问题...在单个查询中提取不需要的索引,而不是在事后循环遍历集合。像这样的东西可能对你有价值:

$me = App\User::first();

$group = App\Group::with(['users'  => function($query) use($me){
        $query->where('users.id', '!=', $me->id);
    }])->first();

此查询将从数据库中的集合 中删除不需要的用户,从而消除对额外代码的需要,这正是我认为您想要的。

HTH.