cakePHP 3.3 cast typeMap in where()

时间:2017-03-17 09:00:46

标签: php mysql cakephp orm

我正在尝试从类型为VARCHAR的表字段customernumber中获取数据。情况就是这样,因为客户编号可以是“0024”和“1234”。

$query->getTypeMap()告诉我它在cakePHP中有string类型。现在,当输入“24”或“0024”时,我们的客户希望以“0024”获得客户。

没问题我想到了,所以我只是将输入值打印到int。但是cakePHP ORM似乎根据类型映射进行投射,我不知道如何在运行中更改类型。

我试过了:

$query->find()
      ->select()
      ->where(['customernumber' => intval($input)]
      ->typeMap(['customernumber' => 'integer']); 

但在搜索输入中输入24时,我收到一个空结果。

我希望你能看到我在寻找的东西。谢谢!

2 个答案:

答案 0 :(得分:0)

我会使用mysql CAST函数

    $cast = $query->func()->convert([
            'customernumber' => 'identifier',
            'signed' => 'literal'
        ]) ;

    $input = '0024';

    $query
        ->where(function ($exp) use ($cast, $input) {
        return $exp->eq($cast, intval($input));
    });

以这种方式生成的查询将是

WHERE (convert((username), signed)) = '23'

答案 1 :(得分:0)

谢谢大家,对不起,如果我的问题不清楚,但是今天早上我能够找到解决方案,考虑到你的意见和答案,并通过ORM调试了一下我终于找到了一个解决方案,这对我有用。

问题是字段customernumber设置为" text"在进行customernumber = :comparevalue之类的比较操作时,:comparevalue始终被强制转换为文本。所以我不得不把它映射到' Integer'在飞行中,我现在就这样做了:

$query->where(function ($exp) use ($input) {
    return $exp->eq('customernumber', intval($input), 'integer');
})