我在数据库中有一个电子邮件域黑名单(表black_list_domains
,域为id
和domain
),我需要在注册时验证用户的电子邮件地址。
如果用户的电子邮件与模式'%@%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做到这一点。还是不?
答案 0 :(得分:2)
like
比较数组中,第二个参数默认为列名。您可能应该对整个条件使用表达式,以避免%
;
BlackListDomains::find()
->where(new \yii\db\Expression(":email LIKE CONCAT('%@%', domain)", [
'email' => $email,
]))
->exists();