CakePHP 3:查询中的嵌套SQL函数

时间:2015-07-07 08:44:05

标签: cakephp cakephp-3.0 query-builder

使用CakePHP 2多年后,我一周前迁移到了CakePHP 3。新的ORM非常棒,但它让我偶然发现了一些基本的东西,这些东西过去常常起作用,在新版本中表现不同。

我应该如何在UsersTablefind()where()链方法的蛋糕狂欢中query()构建此查询?

SELECT * FROM `users` WHERE `email` = "ex@ample.com" AND `password`= SHA1(MD5(CONCAT("somePassword", `salt`)))

我会在没有发布实现这一目标的试验的情况下离开,我几乎尝试添加表达式,条件等等。现在我很好奇它应该如何完成。

编辑:这个问题关于身份验证,更多的是关于如何在CakePHP 3中执行此类查询。

2 个答案:

答案 0 :(得分:2)

你应该读到这个: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]);

答案 1 :(得分:2)

为了完整起见,可以通过简单地嵌套函数表达式来创建嵌套函数。

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`' => 'literal'
                        ])
                    ])
                ])
            ]);
    });

或者,可能会被认为更简单

$functionsBuilder = $Users->query()->func();

$query = $Users
    ->find()
    ->where([
        'email' => $email,
        'password' => $functionsBuilder->SHA1([
            $functionsBuilder->MD5([
                $functionsBuilder->CONCAT([
                    $password,
                    '`salt`' => 'literal'
                ])
            ])
        ])
    ]);

应该注意的是,这只是嵌套的一个例子,在进行身份验证时,使用@AlexStallen提到的身份验证处理程序和正确的密码哈希

另请参阅 Cookbook > Database Access & ORM > Query Builder > Using SQL functions