如何获得通过特定策略的所有用户的列表?

时间:2019-02-27 09:07:59

标签: php laravel authorization

添加项目后,我将获取所有有权查看该项目的用户以通知他们。
这是在一个侦听器中发生的:

[['Local Interface', 'Parent Interface', 'Chassis Id', 'Port info', 'System Name'], ['ge-0/0/1'], ['{master}']]

这有效。但是当我的系统中有1000个用户并且5个用户可以查看该项目时,我将遍历995个用户。
随着事件和侦听器同步运行,添加项目的用户必须等待这种情况发生。

我该如何加速呢?

编辑:好的,可以将侦听器排队。但是,改进此代码会很棒。

2 个答案:

答案 0 :(得分:0)

我对Gate Facade不熟悉,但是如果它在具有关系的模型中,则可以使用whereHas:

$users = App\User::whereHas('permissions', function ($q) use ($event) {
    $q->where('name', 'view')->where('model_id', $event->project->id);
})->get();

https://laravel.com/docs/5.7/eloquent-relationships#querying-relationship-existence

答案 1 :(得分:0)

您可以使用laravel的Notifications特性来允许订阅的用户接收通知事件。这些通知可以排队等待以后处理,通过电子邮件/短信/闲置发送,保存到数据库,或者像您的用例一样用于广播消息。

发出新通知

php artisan make:notification InvoicePaid

使用可通知的特征

<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use Notifiable;
}

现在用户有一个 notify 方法,该方法以 notification 作为参数

use App\Notifications\InvoicePaid;

$user->notify(new InvoicePaid($invoice));

https://laravel.com/docs/5.8/notifications

教程:https://code.tutsplus.com/tutorials/notifications-in-laravel--cms-30499