如何解决Active Record Yii2中列名的问题?

时间:2019-12-04 10:43:11

标签: php yii2

我在数据库中有一个电子邮件域黑名单(表black_list_domains,域为iddomain),我需要在注册时验证用户的电子邮件地址。

如果用户的电子邮件与模式'%@%domain'相匹配,则验证必须添加错误。

因此,有效的mysql查询是:

SELECT * FROM `black_list_domains` WHERE '$email' LIKE CONCAT('%@%', domain)"

但是当我尝试使用Active Record在我的Validator的类中进行检查时

BlackListDomains::find()->where(['like', $email, new \yii\db\Expression("CONCAT('%@%', domain)")])->exists();

它返回MySQL错误Column not found: 1054 Unknown column 'test@test.test' in 'where clause'test@test.test是用户的电子邮件地址)。

我可以使用createCommand进行正确的查询:

\Yii::$app->db->createCommand("SELECT * FROM `black_list_domains` WHERE '$email' LIKE CONCAT('%@%', domain)")->queryAll();

但是我认为可以通过Active Record做到这一点。还是不?

1 个答案:

答案 0 :(得分:2)

like比较数组中,

第二个参数默认为列名。您可能应该对整个条件使用表达式,以避免%;

的不必要转义。
BlackListDomains::find()
    ->where(new \yii\db\Expression(":email LIKE CONCAT('%@%', domain)", [
        'email' => $email,
    ]))
    ->exists();