拉拉维尔:如何通过 id 从收藏中删除项目


Laravel: how to remove item from Collection by id

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