Php Laravel:如何按id从集合中删除项

Php Laravel:如何按id从集合中删除项,php,laravel,Php,Laravel,我想从我的收藏中删除管理员用户。我知道表中的主键(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')) $use

我想从我的收藏中删除管理员用户。我知道表中的主键(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);

与其尝试从集合中删除项目,不如一开始就不要选择它

您可以向DB查询添加如下约束:

$users = User::where('role', '!=', 'admin')->get();
$users = User::whereHas('roles', function($q){
    $q->where('role', '!=', 'admin');
})->get();
(这可能略有不同,具体取决于模式中角色的定义方式)

如果您使用的是一个更复杂的模式,它有一个单独的
角色
表和
用户角色
表,您可以这样查询:

$users = User::where('role', '!=', 'admin')->get();
$users = User::whereHas('roles', function($q){
    $q->where('role', '!=', 'admin');
})->get();
依赖管理员用户始终是集合中的第一项是个坏主意。如果以后您想拥有多个管理员用户,或者按注册日期对用户列表进行排序,该怎么办?如果您真的想从集合中删除管理员,Eloquent具有内置过滤功能:

$usersWithoutAdmins = $users->filter(function($user)
{
    return !$user->hasRole('admin');
});

因此,bencohenbaritone的答案是解决此问题的更好方法,我必须补充的是,Laravel Eloquent Collection有方法
except()
,它可以通过主键而不是
忘记()
从集合中删除Eloquent对象。后者通过集合索引键(如
array[i]
)而不是主键进行删除

因此,您可以编写类似这样的内容(很抱歉,这是一个糟糕的示例,我自己的用例太不一样了,无法对其他人有用):


你的意思是,你不想从数据库中删除它?只是从$users集合中删除?是的。我不想在我的视图上的用户列表中显示管理员用户。我尝试拉($key)的可能重复以及相同的问题$key绝对不是主键或$id。似乎$key是从0开始的数组索引。我用
$users->find(1)
替换为
$users[0]
来检查元素,而不是id非常好的答案。我使用的是与您的第二个解决方案相对应的“信任/委托”,但它使用了列
名称
,而不是
角色
。解决方案不会选择未分配角色的用户。。。我需要强制将角色分配给所有用户,我可能无论如何都应该这样做……所以我需要的太多了,但哦,好吧。我希望我不会花那么长时间去做。我在尝试保存角色的关系时遇到了很多困难。请参阅[laravel如何查询以获取除关系有名称列之外的所有记录]。如果您知道如何进行第二次查询,您向我展示了如何获取没有角色的用户。这对我有所帮助,因为我有一个情况,我不能正确地处理一个数据库查询,这只是一张罚单!