我想从我的集合中删除管理员用户。我知道表中的主键 (id) 是 1。但是当我使用 forget(1)
时,它会从 0 开始删除集合中的数组元素。如何通过 id 从集合中删除项目?
// Grab all the users
$users = User::all(); //$this->user; use to return array not Laravel Object
if($users->find(1)->hasRole('admin'))
$users->forget(0);
因此,Bencohenbaritone的答案是解决此问题的更好方法,我必须补充一点,Laravel Eloquent Collection具有方法except()
,它可以通过主键而不是forget()
从集合中删除Eloquent对象。后者按集合索引键(如array[i]
)而不是按主键删除。
所以你可以写这样的东西(对不起,这个不好的例子,我自己的用例太不同了,对其他人没有用):
$admin_user_id = 20;
$users = User::all();
$users_without_admin = $users->except($admin_user_id);
与其尝试从集合中删除项目,不如从一开始就不要选择它。
您可以像这样向数据库查询添加约束:
$users = User::where('role', '!=', 'admin')->get();
(根据在架构中定义角色的方式,可能会略有不同)。
如果使用具有单独的roles
表和user_role
表的更复杂的架构,则可以像这样查询:
$users = User::whereHas('roles', function($q){
$q->where('role', '!=', 'admin');
})->get();
依赖管理员用户始终是集合中的第一项是一个坏主意。如果以后您希望拥有多个管理员用户,或按注册日期对用户列表进行排序,该怎么办?如果您真的想从集合中删除管理员,Eloquent 具有内置的过滤功能:
$usersWithoutAdmins = $users->filter(function($user)
{
return !$user->hasRole('admin');
});