【问题标题】:Remove a collection from a collection从集合中删除集合
【发布时间】:2017-05-20 06:18:23
【问题描述】:

我一直在为我的 Laravel 应用程序构建一个自定义票证系统,用户可以在他们的票证上放置 cmets。

当有新评论出现时,我想向参与票证的每个人发送通知。

用户可以参与,如果他们是:

  • 票的所有者
  • 分配给工单的代理
  • 被邀请作为门票的参与者

为此,我创建了一个用户集合,然后循环访问他们以通知他们。唯一的问题是它目前也包括发表评论的人,他们不需要通知,因为他们是发表评论的人。

如果 id 与当前登录的用户匹配,我已尝试 filter 集合删除用户,但这似乎不起作用:

$ticket = App\Ticket::findOrFail(1);

//Create collection to hold users to be notified
$toBeNotified = collect();

//Add the ticket owner
$toBeNotified->push($ticket->owner);

//If an agent is assigned to the ticket, add them
if(!is_null($ticket->assigned_to)) $toBeNotified->push($ticket->agent);

//Add any active participants that have been invited
$ticket->activeParticipants()->each(function($participant) use ($toBeNotified) {
    $toBeNotified->push($participant->user);
});

//Remove any duplicate users that appear
$toBeNotified = $toBeNotified->unique();

//Remove the logged in user from the collection
$toBeNotified->filter(function($user) {
    return $user->id != Auth::user()->id;
});

//...loop through each user and notify them

进一步阅读,我认为这是因为您使用filter 从集合中删除元素,而不是在集合中的集合。

如果用户是当前登录的用户,我如何从集合中删除用户?

当我dd($toBeNotified)运行上面之后,结果是这样的:

【问题讨论】:

    标签: php laravel collections laravel-5.2


    【解决方案1】:

    您可以使用except 来实现此目的。

    $toBeNotified = $toBeNotified->except(auth()->id());
    

    作为附注,当您想要添加多个用户时应该使用合并。

    $toBeNotified = $toBeNotified->merge($ticket->activeParticipants);
    

    你使用的过滤方法也是正确的,但是它返回过滤后的集合,同时保持原始集合不变。

    $toBeNotified = $toBeNotified->filter(function($user) {
        return $user->id != auth()->id();
    });
    

    编辑:except 仅在您有一个雄辩的集合时才有效。

    【讨论】:

    • except() 将不起作用,因为它会根据集合中的键排除项目,并且键与用户的 id 无关。不过,如果您首先执行 keyBy() 以通过用户 ID 键入集合,它会起作用。
    • @patricus 我一周前在这个项目中使用过except github.com/gothinkster/laravel-realworld-example-app/blob/…,我确信它有效。我什至已经继续写了一个测试让你自己检查。不确定您是否甚至懒得测试就发表了该评论。检查我更新的答案。
    • @Sandeesh 对此表示感谢。我实现了merge() 来清理代码并使用filter() 但正如您指出的那样,我正在更改$toBeNotified 以实际设置为返回的内容。感谢您的帮助!
    • @Sandeesh 我将授予您,您的包中的用法将起作用,并且您提供的测试中的用法将起作用,但它不适用于 OP 显示的用法。不同之处在于您正在处理Illuminate\Database\Eloquent\Collection,而OP 创建了一个普通的Illuminate\Support\Collection。使用模型的键调用 except() 将从 Eloquent 集合中删除该模型,但不会从标准集合中删除该模型。您可以通过在测试中添加->toBase() 来亲自查看:$users = factory('App\User', 5)->create()->toBase();
    • @patricus 谢谢你教我,我很少使用collect,并且认为推送模型的行为与它们相同。我已经测试了你所说的,你是绝对正确的。干杯!
    猜你喜欢
    • 2021-08-27
    • 2020-03-20
    • 2011-02-06
    • 2016-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多