CakePHP 3:查询中的嵌套 SQL 函数
CakePHP 3: Nested SQL functions in a query
使用 CakePHP 2 多年后,我在一周前迁移到了 CakePHP 3。新的 ORM 很棒,但它让我偶然发现了一些基本的东西,这些东西以前可以工作,但在新版本中表现不同。
我应该如何在 Cake 狂欢的 find()
、where()
和 query()
链方法中的 UsersTable
上构建此查询?
SELECT * FROM `users` WHERE `email` = "ex@ample.com" AND `password`= SHA1(MD5(CONCAT("somePassword", `salt`)))
我不会发布实现此目的的试验,我尝试了很多关于添加表达式、条件等的操作。现在我很好奇它到底应该如何完成。
编辑:这个问题不是关于身份验证的问题,更多的是关于如何在 CakePHP 3 中执行此类查询。
你真的应该读读这个:http://book.cakephp.org/3.0/en/controllers/components/authentication.html 然后你可以这样做:
$hasher = $this->passwordHasher();
$hashedPassword = $user->get($fields['password']); //password from the database
if (!$hasher->check('password_given_by_the_user', $hashedPassword)) {
return false;
}
//password is ok if we reach this point
嵌套SQL:http://book.cakephp.org/3.0/en/orm/query-builder.html
$this->Model->find()
->where([$conditions])
->where([$more_conditions]);
为了完整起见,可以通过简单地嵌套函数表达式来创建嵌套函数。
use Cake\Database\Expression\QueryExpression;
use Cake\Database\Expression\Cake\ORM\Query;
$email = 'foo@bar.baz';
$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 2 多年后,我在一周前迁移到了 CakePHP 3。新的 ORM 很棒,但它让我偶然发现了一些基本的东西,这些东西以前可以工作,但在新版本中表现不同。
我应该如何在 Cake 狂欢的 find()
、where()
和 query()
链方法中的 UsersTable
上构建此查询?
SELECT * FROM `users` WHERE `email` = "ex@ample.com" AND `password`= SHA1(MD5(CONCAT("somePassword", `salt`)))
我不会发布实现此目的的试验,我尝试了很多关于添加表达式、条件等的操作。现在我很好奇它到底应该如何完成。
编辑:这个问题不是关于身份验证的问题,更多的是关于如何在 CakePHP 3 中执行此类查询。
你真的应该读读这个:http://book.cakephp.org/3.0/en/controllers/components/authentication.html 然后你可以这样做:
$hasher = $this->passwordHasher();
$hashedPassword = $user->get($fields['password']); //password from the database
if (!$hasher->check('password_given_by_the_user', $hashedPassword)) {
return false;
}
//password is ok if we reach this point
嵌套SQL:http://book.cakephp.org/3.0/en/orm/query-builder.html
$this->Model->find()
->where([$conditions])
->where([$more_conditions]);
为了完整起见,可以通过简单地嵌套函数表达式来创建嵌套函数。
use Cake\Database\Expression\QueryExpression;
use Cake\Database\Expression\Cake\ORM\Query;
$email = 'foo@bar.baz';
$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