cakePHP 3.3 在 where() 中转换 typeMap

Posted

技术标签:

【中文标题】cakePHP 3.3 在 where() 中转换 typeMap【英文标题】:cakePHP 3.3 cast typeMap in where() 【发布时间】:2017-03-17 09:00:46 【问题描述】:

我正在尝试从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 时,我收到一个空结果。

我希望你看到我在寻找什么。谢谢!

【问题讨论】:

不能只用mysql CAST吗? 嗯,你的意思是这样的:$query->find()->select()->where(['customernumber' => $query->func()->cast($input)]->typeMap(['customernumber' => 'integer']); ?可悲的是,我也不会收到结果。 no where([$query->func()->cast('customernumber') => $input]) 或类似的东西(我实际上并没有尝试过该代码) 【参考方案1】:

谢谢大家,对不起,如果我的问题不是很清楚,但是今天早上我能够找到解决方案,在考虑到您的 cmets 并通过 ORM 回答和调试后,我终于找到了解决方案,这对我有用。

问题是字段 customernumber 被设置为类型“文本”,并且在执行像 customernumber = :comparevalue 这样的比较操作时,:comparevalue 总是被转换为文本。所以我不得不即时将它映射到“整数”,我现在正在这样做:

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

【讨论】:

【参考方案2】:

我会使用 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'

【讨论】:

谢谢,正如您所指出的,它将生成 where 查询部分,但我仍然没有得到任何结果。我还尝试直接在 MySQL Workbench 中查询数据库,但也不会得到任何结果。我不知道,但是否可以在 where 子句中以这种方式转换表字段... @ndm:你的想法的问题是,我们的客户过去没有标准化其客户编号,所以可能有像“0042”这样的数字,但也有像“01234”这样的数字”。 :// @Seb 我明白了,从你的问题看来,好像有 4 个字符的限制。

以上是关于cakePHP 3.3 在 where() 中转换 typeMap的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 CakePHP3 ORM 获取字符串格式的 where 子句?

cakephp 3.3:模型在url中时的分页和排序错误

CakePHP 3组件在一个单元格中

在 CakePHP 中将计数查询转换为包含语句中的列表

在 cakephp 3 中获取记录时更改字段名称

Cakephp3 ElasticSearch查询Q