我在CakePHP 3条件的问题。我正在尝试处理深度关联模型,并为搜索引擎构建大查询。
这里的查询已调试:
SELECT
Ouvrages.zone_id AS `Ouvrages__zone_id`,
Ouvrages.parent_id AS `Ouvrages__parent_id`,
Ouvrages.classe_ouvrage_id AS `Ouvrages__classe_ouvrage_id`,
Ouvrages.numero AS `Ouvrages__numero`,
Valeurs.valeur AS `Valeurs__valeur`
FROM
ouvrages Ouvrages
INNER JOIN
elements Elements
ON Ouvrages.id = (
Elements.ouvrage_id
)
INNER JOIN
valeurs Valeurs
ON Elements.id = (
Valeurs.element_id
)
INNER JOIN
caracteristiques Caracteristiques
ON Caracteristiques.id = (
Valeurs.caracteristique_id
)
WHERE
(
Ouvrages.zone_id in (
:c0,:c1,:c2,:c3,:c4,:c5,:c6,:c7,:c8,:c9,:c10,:c11
)
AND Ouvrages.classe_ouvrage_id = :c12
AND Elements.classe_element_id = :c13
AND Valeurs.caracteristique_id = :c14
AND valeur > :c15
)
GROUP BY
Valeurs.id
如果我在mysql控制台测试它,它可以正常工作。
但是cakephp的ORM没有给我相同的结果。功能gt
、lt
、gte
或lte
不工作
我使用$this->log($query, 'debug')
并使用新的查询日志文件配置我的应用程序配置,但如果我使用debug
,我得到了相同的结果:
SELECT
Ouvrages.zone_id AS `Ouvrages__zone_id`,
Ouvrages.parent_id AS `Ouvrages__parent_id`,
Ouvrages.classe_ouvrage_id AS `Ouvrages__classe_ouvrage_id`,
Ouvrages.numero AS `Ouvrages__numero`,
Valeurs.valeur AS `Valeurs__valeur`
FROM
ouvrages Ouvrages
INNER JOIN
elements Elements
ON Ouvrages.id = (
Elements.ouvrage_id
)
INNER JOIN
valeurs Valeurs
ON Elements.id = (
Valeurs.element_id
)
INNER JOIN
caracteristiques Caracteristiques
ON Caracteristiques.id = (
Valeurs.caracteristique_id
)
WHERE (
Ouvrages.zone_id in (
:c0,:c1,:c2,:c3
)
AND Ouvrages.classe_ouvrage_id = :c4
AND Elements.classe_element_id = :c5
AND Valeurs.caracteristique_id = :c6
AND valeur >= :c7)
GROUP BY
Valeurs.id
感谢ndm在AJAX中调试sql查询的解释。我将我的连接配置为true,我得到了这样的结果:
WHERE (
Ouvrages.zone_id in (
34,35,44,46
)
AND Ouvrages.classe_ouvrage_id = '60'
AND Elements.classe_element_id = '62'
AND Valeurs.caracteristique_id = '25'
AND valeur >= '5')
我正在试着转换这些数字,但是我还没有找到方法。简单的(int)
不行
我明白我的错误了。实际上,我们构建了一个奇怪的Valeurs
表,其中列value
与caracteristic
相关联。value
列定义为varchar(255)
,但可以包含Numeric、String或Date。我们知道当前值的类型,因为我们也有一个type
列。
但是CakePHP ORM自动将每个数据强制转换为字符串,因为varchar
定义。我们必须自己强制转换数据:
function ($exp) use ($data) {
return $exp->{$data['operand']}('valeur', $data['valeur'], 'integer');
};