如何使用PostgreSQL函数将表返回为CakePHP 3模型?

时间:2017-07-06 11:10:26

标签: postgresql cakephp

使用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并将其与查询结果合并

由于

1 个答案:

答案 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