次のモデル関係が定義されています。
class Publication extends AppModel {
var $name = 'Publication';
var $hasAndBelongsToMany = array(
'Author'=>array(
'className'=>'Author'
)
);
}
class Author extends AppModel {
var $name = 'Author';
var $hasAndBelongsToMany = array(
'Publication'=>array(
'className'=>'Publication'
)
);
var $belongsTo = array(
'College' => array (
'className' => 'College'
)
);
}
class College extends AppModel {
var $name = 'College';
var $hasMany = array(
'Department'=>array(
'className'=>'Department'
)
);
}
class Department extends AppModel {
var $name = 'Department';
var $belongsTo = array(
'College'=>array(
'className'=>'College'
)
);
}
データベース テーブルが正しく設定されている (HABTM の結合テーブルなど)。それらすべてを支配する 1 つの DB クエリを見つけようとしています。関連する著者、大学、学部などを含むすべての出版物を検索するクエリを作成したいと考えています。フォームからデータを取得した後、次のようなクエリを実行しようとしました。
$conditions = array(
"Author.id" => $this->data['authors'],
"Publication.year" => $this->data['year']
);
$publications = $this->Publication->find('all', array('conditions' => $conditions));
これにより、Author.id が有効なフィールドではないという SQL エラーがスローされます。これは、Author.id が検索されるまでに「authors」データベース テーブルとの結合が完了していないためです。しかし、私がこれを行うと:
$pubs = $this->Publication->find('all', array('conditions' => $conditions));
次に、関連付けられたすべての著者を含むすべての出版物を含む配列を取得します (ただし、何らかの理由で関連付けられた大学ではありません)。
私の質問はこれです: Author.id が検索される前にテーブルを結合するにはどうすればよいですか? bindModel、containable、サブクエリを使用しようとしましたが、何らかの理由でそれらを機能させることができません (おそらく ID10T エラー)。
アドバイスをありがとう!
編集:次の呼び出しの結果:
$this->Publication->recursive = 2;
$pubs = $this->Publication->find('all');
以下の通り:
Array (
[0] => Array ( [Publication] => Array ( [id] => 1 [title] => TestArticle [year] => 2011 [type_id] => 3 ) [Type] => Array ( [id] = > 3 [type_name] => Journal Articles ) [Author] => Array ( [0] => Array ( [id] => 2 [firstname] => Jeremy [lastname] => Gustine [middle] => A [faculty ] => 0 [college_id] => 4 [AuthorsPublication] => 配列 ( [id] => 3 [author_id] => 2 [publication_id] => 1 ) [College] => 配列 ( [id] => 4 [ college_name] => 文学、芸術、科学 ) ) [1] => Array ( [id] => 3 [firstname] => George [lastname] => Obama [middle] => A [faculty] => 0 [ college_id] => 6 [AuthorsPublication] => Array ( [id] => 2 [author_id] => 3 [publication_id] =>1 ) [College] => Array ( [id] => 6 [college_name] => School of Public Affairs ) ) [2] => Array ( [id] => 2 [firstname] => Jeremy [lastname] => Gustine [middle] => A [faculty] => 0 [college_id] => 4 [AuthorsPublication] => Array ( [id] => 1 [author_id] => 2 [publication_id] => 1 ) [College] =>配列 ( [id] => 4 [大学名] => 文学、芸術、科学) ) ) ) [1] => 配列 ( [出版物] => 配列 ( [id] => 2 [タイトル] => TestBook [ year] => 2010 [type_id] => 1 ) [Type] => Array ( [id] => 1 [type_name] => Books ) [Author] => Array ( [0] => Array ( [id] = > 7 [ファーストネーム] => ソニー [ラストネーム] => スタッフ [ミドル] => L [学部] => 0 [大学 ID] =>5 [AuthorsPublication] => Array ( [id] => 4 [author_id] => 7 [publication_id] => 2) [College] => Array ([id] => 5 [college_name] => Nursing and Health Science ) ) ) ) )
うまくいけば、それはある程度読めます...