[テーブル名][フィールド]
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です。
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
というクエリを生成してくれます。
ありがとうございます。希望通りできました。
モデルに$primaryKeyを指定すれば良いんですね。