【问题标题】:Laravel: how to remove item from Collection by idLaravel:如何通过 id 从集合中删除项目
【发布时间】:2015-01-21 22:12:30
【问题描述】:

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

【问题讨论】:

  • 你的意思是,你不想从数据库中删除它?只是从 $users 集合中删除?
  • 是的。我不想在我的视图中的用户列表中显示管理员用户。
  • Forget doesn't work 的可能重复项
  • 我也试过 pull($key) 和同样的问题。 $key 绝对不是主键或 $id。似乎 $key 是从 0 开始的数组索引。
  • 我用$users[0]替换了$users->find(1)来检查元素而不是id

标签: php laravel


【解决方案1】:

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

所以你可以写这样的东西(抱歉这个不好的例子,我自己的用例太不同了,对其他人有用):

$admin_user_id = 20;
$users = User::all();
$users_without_admin = $users->except($admin_user_id);

【讨论】:

  • 这对我有帮助,因为我有一种情况,我无法正确使用仅数据库查询,而这只是票!
【解决方案2】:

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

您可以像这样向数据库查询添加约束:

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

【讨论】:

  • 非常好的答案。我正在使用与您的第二个解决方案相对应的 Confide/Entrust,但它使用列 name 而不是 roles。该解决方案不会选择没有分配角色的用户......我需要强制为所有用户分配角色,无论如何我可能应该这样做......所以对于我需要的东西来说太过分了,但是哦。我希望不会花那么长时间去做。
  • 我在 Confide/Entrust 尝试保存角色的关系时遇到了很多困难...请参阅 [laravel-how-to-query-to-get-all-records-except-where- relationship-has-name-column] stackoverflow.com/questions/28095206/… 如果您知道如何进行第二次查询,您会向我展示如何获取没有角色的用户。
  • 这不是对实际问题的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多