取り急ぎメモ。
OrderdビヘイビアをActsAsするときに、foreign_keyでソートを指定する範囲(特定のカテゴリー内でソートとか)を指定できるが、複数のフィールドを指定したい場合は、virtualFieldsを利用すればいい。
ex.店舗ID(shop_id) × メニューカテゴリーID(menu_category_id)でソート番号を振りたい場合
// HogeModel.php class Hoge extends AppModel { public $virtualFields = array( 'order_foreign_key' => 'CONCAT(Hoge.shop_id, "_",Hoge.menu_category_id)', ); public $actsAs = array( 'Orderd' => array( 'field' => 'sort', 'foreign_key' => 'order_foreign_key', ), ); }
追記
virtualFieldsを利用した場合、Insertの時に該当のフィールドがないためエラーが出ることがわかりました。
そのため、次のように対応しました。(美しくないけど)
// HogeModel.php class Hoge extends AppModel { public $virtualFields = array( 'order_foreign_key' => 'CONCAT(Hoge.shop_id, "_",Hoge.menu_category_id)', ); public $actsAs = array( 'Orderd' => array( 'field' => 'sort', 'foreign_key' => 'order_foreign_key', ), ); // Insertの対応 public function beforeValidate($options = array()) { // Orderdビヘイビアのforeign_key対策 if (!empty($this->data[$this->alias]['shop_id']) && !empty($this->data[$this->alias]['menu_category_id'])) { // 無理やりforeign_keyを追加してやる $this->data[$this->alias]['orderd_foreign_key'] = $this->data[$this->alias]['shop_id'].'_'.$this->data[$this->alias]['menu_category_id']; } } }
beforeSaveではなくbeforeValidateにしているのは、モデルのbeforeSaveの前にビヘイビアのbeforeSaveが走ってしまうためforeign_keyの設定が間に合わないからです。
検証もそこそこだけど多分これでいけるはず。