Добро пожаловать в Cake!
Одним из самых крутых и мощных аспектов Cake является их способный ORM .Как только вы выясните ассоциации Cake и то, как они работают с базами данных, трудно вернуться к чему-то другому.Но есть пара вещей, которые мы должны убедиться, что мы делаем с нашей реальной физической схемой базы данных, прежде чем мы сможем это сделать.
Итак, давайте поработаем с некоторыми «образцами» данных.
users
-------------------------------------------------------
| id (PK) | role_id (FK) | username | password |
-------------------------------------------------------
| 1 | 1 | cspray | ad64675 |
-------------------------------------------------------
... и т. д. и т. д.
roles
--------------------------------------------
| id (PK) | name |
--------------------------------------------
| 1 | Benevolent Dictator for Life |
--------------------------------------------
... и т. д. и т. п.
Обратите внимание на названия таблиц, users
и roles
и имена полей, в частности id
и role_id
.Это важно.id
обычно является полем с автоинкрементом , int
в вашей базе данных.Есть и другие способы сохранить ваш ключ id
, но давайте не будем слишком много накапливать сразу.
Теперь все это, и мы еще не ответили на ваш вопрос! Не волнуйтесьмы собираемся добраться до этого.Но сначала дважды проверьте схему базы данных и убедитесь, что имена и столбцы таблиц названы в соответствии с Соглашением Cake .Не волнуйся, я подожду ...
...
Хорошо!Теперь откройте ваш любимый текстовый редактор и перейдите к install_dir/app/models/
(где install_dir
- это имя папки, в которой установлен фреймворк).После создания нового файла назовите его user.php
.Внутри этого файла мы будем использовать некоторый код, который выглядит следующим образом ...
class User extends AppModel {
public $belongsTo = array('Role');
}
И, ну, у вас это есть!Теперь вы можете свободно запрашивать таблицу roles
из своего класса User
, вызывая методы через "цепочку ассоциаций" Cake, $this->User->Role->find()
.Вы можете и, вероятно, должны создать модель Role
точно так же, как вы создали User
, без $belongsTo
.Внутри него вы можете определить свои собственные методы взаимодействия с таблицей roles
и предоставить необходимую информацию User
.
Хотя я не хочу вдаваться в подробности о том, как работает ORM Cake, в основномпотому что, если вы прочитаете Cake Cookbook и Cake API , вы найдете множество знаний, готовых к употреблению.
Наслаждайтесь своими приключениями в Cake!
Итак, все ваши ассоциации моделей настроены, и вы готовы к работе.Но куда ты идешь?Итак, вы захотите проверить модели поведения Cake , в частности, одно из самых важных базовых поведений, Containable .Это позволит вам делать именно то, что вы хотите.
Давайте просто посмотрим на некоторый код, я собираюсь предположить, что вы уже знакомы с Model :: find () метод.Если нет, я пойду проверю это очень быстро, чтобы вы не запутались.Хотя это довольно просто.
class User extends AppModel {
// provides $this->User->Role
public $belongsTo = array('Role');
// gives access to various behaviors
public $actsAs = array('Containable');
// custom function
public function get_users_with_roles() {
return $this->User->find(
'contain' => array(
'Role' => array( // tells ORM to query `roles` table
'Hour', // <-- tells ORM to query `hours` table
'conditions' => array(
'Role.id' => '<> NULL'
)
)
),
'fields' => array(
'User.username'
)
);
}
}
Это должно вернуть все имена пользователей пользователя (и, возможно, их id
и role_id
), которые имеют запись в таблице roles
.Обратите внимание на добавление нового свойства и способ размещения «запроса» в ORM Cake.Одна вещь, которую я мог бы предложить освоиться, - это многомерные ассоциативные массивы, Cake использует их много.