Postgresql Yii2:不区分重音的过滤器

Postgresql Yii2:不区分重音的过滤器,postgresql,yii2,accent-insensitive,Postgresql,Yii2,Accent Insensitive,我想使用不区分重音的搜索单词。对于不区分大小写,我使用ilike: $query->andFilterWhere(['ilike', 'name', $this->name]); $query->andWhere(new Expression( 'lower_unaccent(name) ILIKE \'%\' || lower_unaccent(\'' . $this->name . '\') || \'%\'' )); 但是对于不区分重音的问题,我不知道Y

我想使用不区分重音的搜索单词。对于不区分大小写,我使用ilike

$query->andFilterWhere(['ilike', 'name', $this->name]);
$query->andWhere(new Expression(
    'lower_unaccent(name) ILIKE \'%\' || lower_unaccent(\'' . $this->name . '\') || \'%\''
));
但是对于不区分重音的问题,我不知道Yi2解决方案(否则我可以使用这个PHP)

在下一个示例中,我搜索了单词“camara”,但没有找到单词“cámara”(西班牙语中的意思是照相机):


我使用低位非相关PostgreSQL函数和ILIKE PostgreSQL操作符解决了这个问题:

$query->andFilterWhere(['ilike', 'name', $this->name]);
$query->andWhere(new Expression(
    'lower_unaccent(name) ILIKE \'%\' || lower_unaccent(\'' . $this->name . '\') || \'%\''
));

我花了一段时间才使用@rob006对sql注入的评论来完成这项工作:

private static function ExpressionLikeAccentInsensitive($col, $field){
        $bind = md5($col);
        return [
            'ilike',
            new Expression("lower(unaccent({$col}))"),
            new Expression("'%' || lower(unaccent(:q{$bind})) || '%'", [
                ":q{$bind}"=>$field
            ]),
        ];
    }
然后您可以这样称呼它(使用Postgres ILKE的示例):


嗯。。好的,在您的sql查询中更改排序规则运行时,看到这个答案,您只需要告诉MySQL使用不同的排序规则。谢谢@MuhammadOmerAslam,但我不想接触PostgreSQL数据库。看起来您的查询中存在SQLi漏洞。您应该使用prepared语句和params,而不是PHP级别的连接。