Одной из самых мощных особенностей CakePHP является способность создавать реляционные связи, предоставляемая моделью. В CakePHP, связи между моделями осуществляются с помощью ассоциаций.
Определение связей между различными объектами в вашем приложении должно быть естественным процессом. Например: рецепт может иметь много оценок, оценки принадлежат (поставлены) авторами, и авторы могут иметь много рецептов. Определив каким образом эти связи будут работать, вы легко сможете получить доступ к вашим данным.
Цель этого раздела – показать как определять и использовать ассоциации между моделями в CakePHP.
Данные могут получаться из разных источников. Наиболее распространенная форма хранения в веб-приложениях – это реляционная база данных. Об этом и пойдет речь в этом разделе.
В CakePHP существует четыре типа ассоциаций: hasOne, hasMany, belongsTo, hasAndBelongsToMany (HABTM).
Связь | Тип ассоциации | Пример |
один к одному | hasOne | Пользователь имеет один профиль |
один ко многим | hasMany | Пользователь имеет много рецептов |
многие к одному | belongsTo | Рецепты принадлежат пользователю |
многие ко многим | hasAndBelongsToMany | Рецепты имеют и принадлежат множеству тегов |
Ассоциации определяются созданием переменной класса, имя которой совпадает с названием, определяемой вами, ассоциации. Эта переменная может быть простой, как строка, а может быть сложной, как многомерный массив, используемый для определения особенностей ассоциации.
<?php
class User extends AppModel {
var $name = 'User';
var $hasOne = 'Profile';
var $hasMany = array(
'Recipe' => array(
'className' => 'Recipe',
'conditions' => array('Recipe.approved' => '1'),
'order' => 'Recipe.created DESC'
)
);
}
?>
В приведенном примере в строке 'className' => 'Recipe', 'Recipe' – это алиас. Это идентификатор для связи и может быть любым. Обычно, вы будете выбирать такое же имя, которое имеет класс, на который ссылается данный класс. Алиасы должны быть уникальными как для отдельных моделей, так и с двух сторон связей belongsTo/hasMany или belongTo/hasOne. Выбор не уникальных имен для алиасов моделей, может стать причиной непредсказуемого поведения.
CakePHP будет автоматически создавать связи между ассоциируемыми объектами моделей. Таким образом, например, в вашей модели User вы можете получить доступ к модели Recipe:
<? $this->Recipe->someFunction(); ?>
Подобным образом, в вашем контроллере вы можете получить доступ к ассоциируемым моделям, без добавления их в массив $uses:
<? $this->User->Recipe->someFunction(); ?>