考虑到用户访问级别

时间:2017-02-05 11:59:17

标签: php mysql sql yii yii2

我有两张桌子:room和with_access_room

id | name | access_level | image_id     --- room

user_id | room_id | token               --- with_access_room

有三种类型的房间:

  • 公开:每个人都可以看到它(无论是否注册)
  • 私有:只有注册用户才能看到
  • 私有访问权限:只有注册用户可以创建,除了获得特殊令牌以邀请其他用户的创建者外,没有人可以看到它。

现在在主页面我必须展示我的房间。考虑我有一个id = 1的用户。所以他可以看到他创建的所有公共,私有(不需要访问令牌)和私人房间(有访问权限)。

在access_level列中,0是公共的,1是私有的。

例如:

id   |   name  |  access_level  |  image_id
1    |   aaa   |      1         |     1
2    |   bbb   |      0         |     2
3    |   ccc   |      1         |     3
4    |   ddd   |      1         |     4

with_access_room

user_id | room_id | token
   1    |    3    |  xyz
   2    |    4    |  zyx

所以id = 1的用户必须看到这些“table”

ID | name | access_level | image_id | token
1  | aaa  |     1        |    1     | NULL
2  | bbb  |     0        |    2     | NULL
3  | ccc  |     1        |    3     | xyz

我正在与Yii 2合作

使用params的哪个SQL查询或Yii 2模型方法可以给我想要的结果?

2 个答案:

答案 0 :(得分:0)

我认为你没有描述足够的信息来代表问题。缺少信息:

  • "如何私有访问"在数据中表示?
  • "创作者"表示?
  • 我们如何知道谁注册了?

我能猜出这些问题的合理答案。最后,查询将如下所示:

select r.*
from room r
where access_level = 0 or
      (access_level = 1 and
       1 in (select user_id from users u where is_registered = 1)
      ) or
      (access_level = 2 and
       1 in (select user_id from with_access_room war where war.room_id = r.id)
      );

这假定创建者在with_access_room中有一行。

答案 1 :(得分:0)

此查询应该有效:

select `id`, `name`, `access_level`, `image_id`, `token` from `room`
   left join `with_access_room` on `id`=`room_id`
   where `access_level`=0
   or `user_id`=1
   or `id` not in (select `room_id` from `with_access_room`)
   order by `id`