Laravel - 在where子句列中使用mysql函数

时间:2013-11-19 11:17:05

标签: php mysql encryption laravel-4 eloquent

我有一个使用AES_ENCRYPT

的加密字段数据库

数据已加密并应保持这种状态,因此无法更改加密的方法。

最近我开始与Laravel合作开发一个新项目。 当我尝试使用AES加密的字段上的where子句进行更新时, 我收到了以下问题:

SELECT * FROM `users` WHERE `mail` = ? LIMIT 1

以下绑定:

AES_ENCRYPT('email@email.com', 'somekey')

以下代码:

$email = Input::get('email');
$user = User::where("mail", "AES_ENCRYPT('{$email}', '{$this->aesKey}')")->first();

这基本上是合乎逻辑的 - 但是如何使用force它执行以下查询:

SELECT * FROM `users` WHERE `mail` = AES_ENCRYPT(?, 'someKey') limit 1

使用此绑定:

email@email.com

希望有一种方法将函数传递给值

的where子句

3 个答案:

答案 0 :(得分:8)

您可以尝试使用whereRaw()

$user = User::whereRaw("mail", "AES_ENCRYPT('{$email}', '{$this->aesKey}')")->first();

或者只是使用RAW表达式:

$user = User::where("mail", DB::raw("AES_ENCRYPT('{$email}', '{$this->aesKey}'))")->first();

答案 1 :(得分:2)

在laravel 5中,你也可以使用whereRaw和绑定,这样你就可以正确地逃避和注入。

只需将bindings数组作为第二个参数传递。 例如:

$user = User::where("mail = AES_ENCRYPT(:email, :aesKey)", ['email' => $email, 'aesKey' => $this->aesKey])->first();

答案 2 :(得分:0)

$user = User::whereRaw("mail = AES_ENCRYPT('{$email}', '{$this->aesKey}')")->first();