在laravel中使用Gate

6ioyuze2  于 2023-01-14  发布在  其他
关注(0)|答案(2)|浏览(151)

我有一个Server。我需要禁止那些没有创建它的用户编辑Server。但是有一个问题,Server可能有许多Users可以编辑它。我把它放在一个单独的数据库表ServerUserCreate中,其中存储了server_iduser_id
不适合我,因为Server表没有user_id列,因为很多用户可以推荐

Gate::define('server-edit', function (User $user, Server $server) {
    return $user->id === $server->user_id;
});

我需要比较一下

ServerUserCreates->server_id === $server->id || Auth::user()->id === ServerUserCreate->user_id

如果它们相等,那么访问是开放的,但是我完全不知道如何在Gate中实现
ServerUserCreate扫描床

Schema::create('server_user_creates', function (Blueprint $table) {
    $table->engine = 'InnoDB';
    $table->id();
    $table->unsignedBigInteger('server_id');
    $table->unsignedBigInteger('user_id');
    $table->index('server_id', 'suc_server_idx');
    $table->index('user_id', 'suc_user_idx');
    $table->foreign('server_id', 'suc_server_fk')->on('servers')->references('id');
    $table->foreign('user_id', 'suc_user_fk')->on('users')->references('id');
    $table->timestamps();
});
66bbxpm5

66bbxpm51#

考虑到你们的关系定义为

public function servers()
{
    return $this->hasMany(ServerUserCreate::class);
}

Server模型中,您可以通过向关系查询添加WHERE条件来进一步简化Gate定义。
exists()将返回一个布尔值,因此非常适合您的用例。

Gate::define('server-edit', function (User $user, Server $server) {
    return $server->servers()->where('user_id', $user->id)->exists();
});

你也可以用count()代替exists(),在PHP中,如果你把一个数字转换成布尔值,0为假,其余的为真。

Gate::define('server-edit', function (User $user, Server $server) {
    return $server->servers()->where('user_id', $user->id)->count();
});
u5rb5r59

u5rb5r592#

我自己就能弄清楚这个问题。也许它会对某人有所帮助,以下是我的解决方案

Gate::define('server-edit', function (User $user, Server $server) {
    $ServerUsers = $server->servers()->get();
    foreach ($ServerUsers as $ServerUser) {
        if ($ServerUser->server_id === $server->id && $ServerUser->user_id === $user->id) {
            return Response::allow();
        }
    }
    return Response::deny();
});
if (! Gate::allows('server-edit', $server)) {
    abort(403, 'Stop Stop!');
}
    • 服务器型号**
public function servers()
{
    return $this->hasMany(ServerUserCreate::class);
}

相关问题