- 2012-01-10 (火)
- PHP
CakePHP における HABTM association table を更新する際に便利な Behavior がこの ExtendAssociationsBehavior:
HABTM Add & Delete Behavior - The Bakery, Everything CakePHP
ただこの Behavior, CakePHP 1.2 時代に作られたもので現行版の CakePHP 2.0.x だと動作しなかったので、パッチコードを書いてみた。以下:
Updated Version of ExtendAssociationsBehavior for CakePHP 2.0.x
Download
Patch
$ diff -u old new
--- Vendor/Model/Behavior/ExtendAssociationsBehavior.php 2012-01-10 23:31:14.000000000 +0900
+++ Vendor/Model/Behavior/ExtendAssociations2Behavior.php 2012-01-10 23:33:57.000000000 +0900
@@ -1,5 +1,6 @@
<?php
-class ExtendAssociationsBehavior extends ModelBehavior {
+App::uses('ModelBehavior', 'Model');
+class ExtendAssociations2Behavior extends ModelBehavior {
/**
* Model-specific settings
* @var array
@@ -44,7 +45,7 @@
// important to use array_unique() since merging will add
// non-unique values to the array.
$data[$assoc][$assoc] = array_unique(am($data[$assoc][$assoc], $assoc_ids));
- return $model->save($data);
+ return $model->save($data, array('fieldList'=>array($assoc)));
}
// association doesn't exist, return false
@@ -82,7 +83,7 @@
// which is the ones we want to re-save.
$data[$assoc][$assoc] = array_diff($data[$assoc][$assoc], $assoc_ids);
}
- return $model->save($data);
+ return $model->save($data, array('fieldList'=>array($assoc)));
}
// association doesn't exist, return false
@@ -122,7 +123,7 @@
// unbind all models except the habtm association
$this->unbindAll($model, array('hasAndBelongsToMany' => array($assoc)));
- $data = $model->find(array($model->name.'.'.$model->primaryKey => $id));
+ $data = $model->findById($id);
$model->recursive = $tmp_recursive;
$model->cacheQueries = $tmp_cacheQueries;
@@ -149,8 +150,8 @@
*/
function unbindAll(&$model, $exceptions = array()) {
$unbind = array();
- foreach($model->__associations as $type) {
- foreach($model->{$type} as $assoc=>$assocData) {
+ foreach($model->_associations as $type) {
+ foreach($model->$type as $assoc=>$assocData) {
// if the assoc is NOT in the exceptions list then
// add it to the list of models to be unbound.
if(@!in_array($assoc, $exceptions[$type])) {
@@ -164,3 +165,4 @@
}
}
}
+
Usage
使い方は旧版から変更無し:
## add
$model->habtmAdd($assoc_name, $from_id, array($to_id1, $to_id2, ...));
e.g. $this->Post->habtmAdd('PostsTag', 1, array(2, 3));
## delete
$model->habtmDelete($assoc_name, $from_id, array($to_id1, $to_id2, ...));
e.g. $this->Post->habtmAdd('PostsTag', 1, array(3));
## delete all
$model->habtmDeleteAll($assoc_name, $from_id);