Cakephp 3 gt, lt, gte and lte issue



我在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没有给我相同的结果。功能gtltgtelte不工作

我使用$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表,其中列valuecaracteristic相关联。value列定义为varchar(255),但可以包含Numeric、String或Date。我们知道当前值的类型,因为我们也有一个type列。

但是CakePHP ORM自动将每个数据强制转换为字符串,因为varchar定义。我们必须自己强制转换数据:

function ($exp) use ($data) {
    return $exp->{$data['operand']}('valeur', $data['valeur'], 'integer');
};