我想在过滤后的Builder结果中使用attach()
:
$users = User::whereIn('type', array(1, 2))->get();
$usersType_1 = $users->filter(function($item) {
return $item->type == 1;
});
$usersType_2 = $users->filter(function($item) {
return $item->type == 2;
});
$usersType_1->role()->attach(3);
$usersType_2->role()->attach(4);
因此,我需要根据用户role
附加type
。在role()
模型
User
方法
上面代码中的attach()
部分会引发以下错误:方法角色()不存在 - 我认为这是因为filter()
返回了一个集合
是否有工作方法可以在过滤的Builder结果上附加数据透视表条目?或者我是否需要运行2个单独的查询并分别运行attach()
?
答案 0 :(得分:0)
为什么不这样做:
$usersType_1 = $users->where('type', 1); // or whereType(1)
$usersType_1->role()->attach(3);
$usersType_2 = $users->where('type', 2); // or whereType(1)
$usersType_2->role()->attach(4);
我认为"方法角色()不存在"发生异常是因为您正在过滤 Eloquent Collection 。
编辑:我明白为什么这不起作用。这是因为您尝试将整个集合附加到角色。如果您使用find()然后附加了一个角色,它将起作用。因此,您应该遍历所有类型为1的用户并附加角色
foreach ($usersType_1 as $user) {
$user->role()->attach(3);
}
答案 1 :(得分:0)
您无法使用role
方法而不使用User
模型。试试:
$users = User::whereIn('type', array(1, 2))->get();
$usersType_1 = $users->filter(function($item) {
if($item->type == 1) {
return $item->role()->attach(3);
}
})
->all();
$usersType_2 = $users->filter(function($item) {
if($item->type == 2) {
return $item->role()->attach(4);
}
})
->all();
替代方案:
$users = User::whereIn('type', array(1, 2))->get();
$usersType_1 = $users->filter(function($item) {
$item->type == 1;
})
->all();
$usersType_2 = $users->filter(function($item) {
return $item->type == 2;
})
->all();
$role1 = Role::find(3);
$role2 = Role::find(4);
$role1->users()->attach($usersType_1->puck('id'));
$role2->users()->attach($usersType_2->puck('id'));