2

我正在创建一个网站,在开发过程中,我将数据库系统从 mysql 更改为 postgresql。现在一切似乎都很好,除非我想通过以下方式加入一个(或多个)表(没有 hasMany、hasOne 等):

$this->find('first', array(
    'joins' => array(
        array(
            'table' => 'table_to_joins', // for instance 'foos'..
            'alias' => 'TableToJoinJoin', // ..which implies 'FooJoin'
            'type' => 'INNER',
            'conditions' => array(
                'TableToJoinJoin.a_field1 = CurrentTable.a_field2'
            )
        )
    ),
    'conditions' => array(...),
    'fields' => array('CurrentTable.*', 'TableToJoinJoin.*')
);

我得到错误:

Fatal error: Call to a member function schema() on a non-object in .../lib/Cake/Model/Datasource/Database/Postgres.php on line 405

问题是非对象是TableToJoinJoin。在 Postgres.php 中,代码是:

if (!preg_match('/^.+\\(.*\\)/', $fields[$i]) && !preg_match('/\s+AS\s+/', $fields[$i])) {
                if (substr($fields[$i], -1) === '*') {
                    if (strpos($fields[$i], '.') !== false && $fields[$i] != $alias . '.*') {
                        $build = explode('.', $fields[$i]);
                        /* !! build[0] is TableToJoinJoin  !! */ $AssociatedModel = $model->{$build[0]};
                    } else {
                        $AssociatedModel = $model;
                    }

                    /* line 405 */ $_fields = $this->fields($AssociatedModel, $AssociatedModel->alias, array_keys($AssociatedModel->schema()));
                    $result = array_merge($result, $_fields);
                    continue;
                }
...

只有当我使用 TableToJoinJoin.* 时才会发生这种情况,如果我指定 TableToJoinJoin.id、TableToJoinJoin.foo 等每个字段,它就会起作用。我有很多这样的疑问,所以如果有人可以提供帮助,那就太好了!

谢谢!

4

1 回答 1

0

我只是有同样的问题。经过反复试验,我发现如果我在模型中映射关系(通过 $belongsTo、$hasMany 等),则连接将正常工作。次优,但这就是我所拥有的。

于 2015-04-01T19:21:20.220 回答