В кейке появилась такая неприятная штука как uto-create a model.
С одной стороны это конечно полезно, но с другой стороны очень мешает жить.
К примеру ваша связывающая табличка должна выполнять не только функцию связи но и нести некую функциональсть.
Такой неприятный случай как раз произошел у меня. проект был написан на бетта версии кейка и теперь стала задача поставить релиз.
Разберем на примере что же происходит.
пусть у нас есть три таблички
— users
список юзеров;
— teams
команды (ну например футбольные команды )
— teammates
табличка, связывающая юзеров и команды.
кроме основных полей id, user_id, team_id в ней будут дополнительные поля,
к примеру такие как имя юзера в команде, его номер, дата добаления юзера в команду и флаг удаления из команды.
На каждую табличку мы создаем соответствующую модель: User, Team, Teammate.
Теперь описываем связи для модели Team
var $hasAndBelongsToMany = array(
'User' => array('className' => 'User',
'joinTable' => 'teammates',
'foreignKey' => 'team_id',
'associationForeignKey' => 'user_id',
'unique' => true,
'fields' => '',
'order' => '',
'limit' => '',
'offset' => '',
'finderQuery' => '',
'deleteQuery' => '',
'insertQuery' => ''
)
);
для модели Teammate
var $belongsTo = array(
'User' => array('className' => 'User',
'foreignKey' => 'user_id',
'conditions' => '',
'fields' => '',
'order' => ''
),
'Team' => array('className' => 'Team',
'foreignKey' => 'team_id',
'conditions' => '',
'fields' => '',
'order' => ''
)
);
кроме того, в моделе Teammate мы создадим несколько методов, для работы с ней. ну к примеру test() и test1()
Теперь в контроллере TeamsController подключим модель Teammate и в любом action сделаем pr($this->Teammate).
Увидим, что наша модель Teammate обладает не теми свойствами которыми мы ее наделяли.
Я довольно много убил времени, пока не понял что же происходит. А происходит следующее:
В релиз кейка добавили uto-create a model (http://book.cakephp.org/view/83/hasAndBelongsToMany-HABTM)
Теперь умный кейк видит что есть HABTM и по joinTable создает модель (в нашем случае Teammate) и перетирает существующую,
то что такая модель уже есть его почему-то совсем не волнует.
Затем я увидел параметр with для HABTM — Defines the name of the model for the join table.
By default CakePHP will auto-create a model for you.
Using the example above it would be called RecipesTag.
By using this key you can override this default name.
The join table model can be used just like any «regular» model to access the join table directly.
Хмм, хорошо, подумал я. А не использовать ли мне этот парметр и написал 'with'=>'TeamsUsers', но кейк решил, что модель есть,
а таблички нету, а то, что табличка описана в joinTable его опять же не волнует.
На данный момент я нашел единственный выход:
переименовать таблицу teammates в таблицу teams_users, Teammate прописать $useTable = «teams_users»;, параметр 'joinTable' => 'teams_users'
если у кого-то есть другие идеи поделитесь, как выключить автосоздание моделей ненашел.