我正在为一个包含一些POINT
列的数据库设置一个系统。我使用cookbook示例构建了一个自定义类型,它似乎可以工作。然而,要处理POINT
s,我需要以特殊的方式SELECT
它们:
SELECT ST_AsText(location) as location ...
这对于查询构建器来说并不难:
$this->Houses->find()->select(['location' => 'ST_AsText(location)'])
但是,我更希望这种情况在默认情况下发生。
我想使用beforeFind
事件,但我找不到以下伪代码的正确函数:
public function beforeFind(Event $event, Query $query, ArrayObject $options, $primary)
{
if 'location' in query->getSelectedFields():
replace 'location' by 'location' => 'ST_AsText(location)'
}
**当一个字段将被包含时,如何将其替换为函数?**理想情况下,即使我还没有从控制器调用->select(...)
。
2条答案
按热度按时间trnvg8h31#
在CakePHP 3.5 Always apply asText() MySQL function to Spatial field中找到了我的解决方案。
这对于CakePHP 3.8来说很有效。我决定将事件处理放在行为中,以便于重用:
在我的表对象中:
cs7cruho2#
我使用cake 4和一些遗留代码,因为cake 2,我使用的列的
$query->getDefaultTypes();
是String类型,所以解决方案不起作用...我找到的解决方案是这样的: