使用Cake PHP 3.x,我们有一个PostgreSQL 9.6.3 db。
我们广泛使用返回表的PG函数 - 例如
select * from getStudies(cid,UID, SID);
函数用于各种应用程序 - 其中一个是对表中行的更复杂过滤 - Cake很难。
一种选择是在PHP中将逻辑实现为自定义Cake Model方法,但SQL代码和连接数量使得它在PHP中变得混乱。
我们认为我们应该能够从函数创建一个Cake Model,然后通过Cake Model方法传递参数,但到目前为止还不清楚如何做到这一点。
此代码有效,但它返回没有列的数据,我无法弄清楚如何使用反射从Model模式中获取_columns属性。
public function getStudies($data = array()) {
$customer_id = $data['customer_id'];
$connection = ConnectionManager::get('default');
$sql = "select * from getStudies($customer_id)";
$results = $stmt->fetch();
return $results; }
所以 - 选项1 - 弄清楚如何建模将表作为蛋糕模型返回的函数
选项2 - 使用反射获取_columns并将其与查询结果合并
由于
答案 0 :(得分:1)
正如您在评论中提到的,可以通过其columns()
方法访问架构列详细信息。您可以使用架构信息手动处理结果,或者使用函数作为源,就像在您的示例中一样。
查询构建器from()
方法支持原始SQL和表达式,因此您基本上可以添加任何您喜欢的内容,但是表达式将包含在括号中,在函数调用的情况下这将是无效的SQL,因此你必须使用原始SQL和绑定(请 永远 将(用户)数据直接注入查询):
public function getStudies($customerId)
{
return $this
->find()
->from([
$this->alias() => 'getStudies(:customerId)'
])
->bind(':customerId', $customerId, 'integer');
}
这应该生成类似于
的查询SELECT
Alias.column1, Alias.column2, ...
FROM
getStudies(:customerId) Alias