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": "...",
}
}
}
我尝试过的:
#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 在foreach
循环之后放置values()
,如:
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]);
}
}
$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: 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.
我有以下代码:
// 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": "...",
}
}
}
我尝试过的:
#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 在
foreach
循环之后放置values()
,如: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]); } } $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: 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.