在使用 CakePHP 2 多年之后,我在一周前迁移到了 CakePHP 3。新的 ORM 很棒,但它让我偶然发现了一些基本的东西,这些东西过去可以工作,但在新版本中表现不同。
我该如何在 Cake 的 find()
、where()
和 狂欢中的
链方法?UsersTable
上构建此查询query()
SELECT * FROM `users` WHERE `email` = "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="77120f37161a071b125914181a" rel="noreferrer noopener nofollow">[email protected]</a>" AND `password`= SHA1(MD5(CONCAT("somePassword", `salt`)))
我不会发布实现这一目标的尝试,我尝试了很多添加表达式、条件等。现在我很好奇它到底应该如何完成。
编辑:这个问题与身份验证无关,更多的是关于如何在 CakePHP 3 中执行此类查询。
最佳答案
为了完整起见,可以通过简单地嵌套函数表达式来创建嵌套函数。
use Cake\Database\Expression\QueryExpression;
use Cake\Database\Expression\Cake\ORM\Query;
$email = '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="d7b1b8b897b5b6a5f9b5b6ad" rel="noreferrer noopener nofollow">[email protected]</a>';
$password = 'foo';
$salt = 'bar';
$Users = TableRegistry::get('Users');
$query = $Users
->find()
->where(function(QueryExpression $exp, Query $query) use ($email, $password, $salt) {
return
$exp->and_([
'email' => $email,
'password' => $query->func()->SHA1([
$query->func()->MD5([
$query->func()->CONCAT([
$password,
'salt' => 'identifier'
])
])
])
]);
});
或者,这可能被认为更简单一点
$functionsBuilder = $Users->query()->func();
$query = $Users
->find()
->where([
'email' => $email,
'password' => $functionsBuilder->SHA1([
$functionsBuilder->MD5([
$functionsBuilder->CONCAT([
$password,
'salt' => 'identifier'
])
])
])
]);
应该注意的是,这只是嵌套的示例,在进行身份验证时,请使用@AlexStallen提到的身份验证处理程序和适当的密码哈希器
另请参阅 Cookbook > Database Access & ORM > Query Builder > Using SQL functions
关于CakePHP 3 : Nested SQL functions in a query,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31263784/