CakePHPのbelongsTOの使い方について質問です。


[テーブル名][フィールド]
users:id,category_id,name
categorys:category_id,category_name

としているのですが、Userモデルに
var $belongsTo = array('Category' => array('className' => 'Category','foreignKey' => 'category_id','associationForeignKey' => 'category_id'));

と書くとエラーになり、
categorysテーブルのcategory_idをidにすると結合できます。

これまで「テーブル名_フィールド名」のようなテーブル構成をしていたのでとまどいがあるのですが、
CakePHPでそういう書き方が出来る場合、コードを教えてください。バージョンは1.3.2です。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2010/07/10 01:48:31
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答1件)

id:tdoi No.1

回答回数174ベストアンサー獲得回数75

ポイント60pt

CakePHPのConventionと異なる部分を明示する必要があります。

この場合はCategoryテーブルの主キーがidではないので、それを指定します。

class Category extends AppModel {
	var $name = 'Category';
	var $primaryKey = 'category_id';
}

そのうえで、User belongsTo Categoryなら、次のように記述します。

class User extends AppModel {
	var $name = 'User';
	var $belongsTo = array(
		'Category' => array(
			'className' => 'Category',
			'foreignKey' => 'category_id',
			'conditions' => '',
			'fields' => '',
			'order' => ''
		)
	);
}

これでControllerから、

$this->User->find('all');

とでもすれば、

SELECT `User`.`id`, `User`.`category_id`, `User`.`name`, `User`.`created`, `User`.`modified`, `Category`.`category_id`, `Category`.`category_name`, `Category`.`created`, `Category`.`modified` FROM `users` AS `User` LEFT JOIN `categories` AS `Category` ON (`User`.`category_id` = `Category`.`category_id`) WHERE 1 = 1 

というクエリを生成してくれます。

id:k27w

ありがとうございます。希望通りできました。

モデルに$primaryKeyを指定すれば良いんですね。

2010/07/10 01:48:23

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません