私はウェブサイトを作成しており、開発中にデータベース システムを 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 などの各フィールドを指定すると機能します。そのような質問がたくさんあるので、誰かが助けてくれれば、それは素晴らしいことです!
ありがとうございました!