我想从我的收藏中删除管理员用户。我知道它的主键(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);
答案 0 :(得分:16)
因此 bencohenbaritone 的答案是解决此问题的更好方法,我必须添加Laravel Eloquent Collection的方法except()
,它可以通过<从集合中删除Eloquent对象em>主键而不是forget()
。后者通过集合索引键(如array[i]
)而不是主键删除。
所以你可以写一些类似的东西(抱歉这个坏的例子,我自己的用例太不同了,对其他人没用):
$admin_user_id = 20;
$users = User::all();
$users_without_admin = $users->except($admin_user_id);
答案 1 :(得分:13)
不要试图从集合中删除某个项目,最好不要在第一时间选择它。
您可以在数据库查询中添加约束,如下所示:
$users = User::where('role', '!=', 'admin')->get();
(可能会略有不同,具体取决于您在架构中定义角色的方式)。
如果您使用具有单独的roles
表和user_role
表的更复杂的模式,则可以像这样查询:
$users = User::whereHas('roles', function($q){
$q->where('role', '!=', 'admin');
})->get();
依靠管理员用户永远是集合中的第一个项目是一个坏主意。如果以后您想拥有多个管理员用户,或者按注册日期对用户列表进行排序,该怎么办?如果你真的想从集合中删除admin,Eloquent有内置的过滤功能:
$usersWithoutAdmins = $users->filter(function($user)
{
return !$user->hasRole('admin');
});