Laravel:如何从ID中删除Collection中的项目

时间:2015-01-21 22:12:30

标签: 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'))
        $users->forget(0);

2 个答案:

答案 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');
});