CakePHP 3 : Nested SQL functions in a query

标签 cakephp cakephp-3.0 query-builder

在使用 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/

相关文章:

mysql - 聚合函数不适用于 QB 语句。

php - 在cakephp中获取下一条和上一条记录的id

javascript - Cake PHP 3.0 中的 Jquery ajax 调用

cakephp - 你如何使用composer cli?

java - 运行时 SQL 查询生成器

laravel - 如何从 Laravel 5 中的两个相关表中获取数据?

php - 如何使用 CakePHP 将数据保存在不同的表上?

php - cakePHP - PHP EXCEL 另存为 .html

mysql - CakePHP 3.x 从 AppController 以外的其他 Controller 启动 Auth 组件给出错误结果

authentication - 如何与经过身份验证的用户数据一起检索关联?