我有一个Server
。我需要禁止那些没有创建它的用户编辑Server
。但是有一个问题,Server
可能有许多Users
可以编辑它。我把它放在一个单独的数据库表ServerUserCreate
中,其中存储了server_id
和user_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();
});
2条答案
按热度按时间66bbxpm51#
考虑到你们的关系定义为
在
Server
模型中,您可以通过向关系查询添加WHERE条件来进一步简化Gate定义。exists()
将返回一个布尔值,因此非常适合您的用例。你也可以用
count()
代替exists()
,在PHP中,如果你把一个数字转换成布尔值,0为假,其余的为真。u5rb5r592#
我自己就能弄清楚这个问题。也许它会对某人有所帮助,以下是我的解决方案