在Symfony中,我有一个自定义的DB字段类型“ encrypted”,其定义为:
public function convertToPHPValueSQL($sqlExpr, $platform) {
return 'aes_decrypt(' . $sqlExpr . ', "somekey", "someiv")';
}
以及相应的加密功能,它们很好用,entity:make尊重它们,您可以选择/插入很好,加密是完全透明的。
但是,当为记录搜索功能编写一些DQL以替换findBy时,我注意到在某些情况下,Doctrine / ORM /其中的任何一个都不能正确地构成WHERE子句。
如果我使用findBy(['forename'=>'bob'])为MySQL创建的where子句如下: 在哪里t0.forename = aes_encrypt(?,“ somekey”,“ someiv”)
然后,如果我使用: $ repo-> search($ terms); //搜索是我的存储库功能,目前已简化为测试此功能...
select p.id, p.created, p.version, p.forename
FROM App\Entity\mytable p
WHERE p.forename = :t0
然后,SQL的where子句如下所示: 在哪里p0_.forename =?
没有来自自定义字段定义的加密语句。
所以,问题是-我是否缺少某些东西,或者这实际上是Doctrine / ORM / etc的工作方式,对某些事情采用一种方法,对其他事情采用一种方法?
我记得在某处看到WHERE子句可能不支持自定义字段类型,但是由于它在findBy中起作用,所以我真的没想到它不会在其他地方起作用。
如果是这种情况,那么它是在findBy()+ PHP端完成查询要完成的工作,这充其量只是一个恶臭。