我的数据库中有 3 个表:
- 活动
- 用户
- 公司
一家公司可能有一些用户。一位用户可能有一些活动。用户(具有管理员权限)可以对属于其公司的任何活动执行某些操作。所以,我想检查他是否在他的竞选活动中执行了这些操作(在最后一种情况下,我返回类似“访问被拒绝”之类的内容)。
我的条件
Campaign::join('users', 'users.id', '=', 'campaigns.user_id')
->where('users.company_id', '=', Auth::user()->company->id)
->where('campaigns.id', '=', Input::get('id'))
->first();
因此,如果我有独特的活动 - 没关系,如果我得到 null - 出了点问题,我向用户发送“拒绝访问”,因为他正在处理其他公司的活动。
此代码产生下一个查询:
array(3) {
["query"]=>
string(148) "select * from `campaigns` inner join `users` on `users`.`id` = `campaigns`.`user_id` where `users`.`company_id` = ? and `campaigns`.`id` = ? limit 1"
["bindings"]=>
array(2) {
[0]=>
string(1) "2"
[1]=>
string(2) "13"
}
["time"]=>
float(0.42)
}
使用 phpmyadmin 我尝试了相同的查询并得到了一个 ID = 13 的活动。但是当我调试我的应用程序时,我发现
dd($campaign->id);
而是返回 8。8 也等于campaigns.user_id
(记录同时具有campaigns.id
和campaigns.user_id = 8
)。
我不知道为什么会这样。即使我的 SQL 查询有问题(我怀疑 phpmyadmin 返回了正确的结果),我也得到了 where condition campaigns.id = Input::get('id')
, where Input::get('id') = 13
。为什么要更改id?
当然,我可以分两步进行此安全检查,例如首先获取广告系列,然后检查
$campaign->user->company->id = Auth::user()->company->id
但只是想知道...