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