Телефонная книжка - содержит записи об абонентах и их телофоных номерах
CREATE TABLE 'books'( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `title` varchar(70) CHARACTER SET latin1 NOT NULL, `number` varchar(30) CHARACTER SET latin1 DEFAULT NULL, `created` datetime NOT NULL, `modified` datetime NOT NULL, PRIMARY KEY (`id`) )
Категории - название категорий для классификации абонентов ('Работа', 'Дом', 'Семья' и т.д.):
CREATE TABLE `tags` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `title` varchar(50) CHARACTER SET latin1 NOT NULL, `created` datetime NOT NULL, `modified` datetime NOT NULL, PRIMARY KEY (`id`) )
Т.к. один и тот же абонент может участвовать в разных катеогориях, то понадобится вспомогательная таблица для реализации связи многие ко многим:
CREATE TABLE `books_tags` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `book_id` int(11) NOT NULL, `tag_id` int(11) NOT NULL, `created` datetime NOT NULL, `modified` datetime NOT NULL, PRIMARY KEY (`id`) )
Название таблиц непроизвольно, если вам непонятно откуда и как они получились, то стоит ознакомиться с соглашениями CakePHP и в частности со статьей
Теперь необходимо создать MVC для таблиц books и tags (для books_tags ничего ненужно т.к. это связывающая таблица, напрямую к ней пользователь обращаться не будет).
Самый простой и быстрый способ - воспользоваться Cake Bake, с автоматической генерацией кода, без скаффолдинга с применением связи HABTM
Для пирмера приведу полседовательность действий в консоли для таблицы books:
Welcome to CakePHP v1.3.3 Console --------------------------------------------------------------- App : app Path: /usr/local/apache2/htdocs/t_handbook1/app --------------------------------------------------------------- Interactive Bake Shell --------------------------------------------------------------- [D]atabase Configuration [M]odel [V]iew [C]ontroller [P]roject [F]ixture [T]est case [Q]uit What would you like to Bake? (D/M/V/C/P/F/T/Q) > m --------------------------------------------------------------- Bake Model Path: /usr/local/apache2/htdocs/t_handbook1/app/models/ --------------------------------------------------------------- Possible Models based on your current database: 1. Book 2. BooksTag 3. Tag Enter a number from the list above, type in the name of another model, or 'q' to exit [q] > 1 Would you like to supply validation criteria for the fields in your model? (y/n) [y] > n Would you like to define model associations (hasMany, hasOne, belongsTo, etc.)? (y/n) [y] > y One moment while the associations are detected. --------------------------------------------------------------- Please confirm the following associations: --------------------------------------------------------------- Book hasAndBelongsToMany Tag? (y/n) [y] > y Would you like to define some additional model associations? (y/n) [n] > n --------------------------------------------------------------- The following Model will be created: --------------------------------------------------------------- Name: Book DB Table: `books` Associations: Book hasAndBelongsToMany Tag --------------------------------------------------------------- Look okay? (y/n) [y] > y Baking model class for Book... Creating file /usr/local/apache2/htdocs/t_handbook1/app/models/book.php File `/usr/local/apache2/htdocs/t_handbook1/app/models/book.php` exists, overwrite? (y/n/q) [n] > y Wrote `/usr/local/apache2/htdocs/t_handbook1/app/models/book.php` SimpleTest is not installed. Do you want to bake unit test files anyway? (y/n) [y] > n --------------------------------------------------------------- Interactive Bake Shell --------------------------------------------------------------- [D]atabase Configuration [M]odel [V]iew [C]ontroller [P]roject [F]ixture [T]est case [Q]uit What would you like to Bake? (D/M/V/C/P/F/T/Q) > c --------------------------------------------------------------- Bake Controller Path: /usr/local/apache2/htdocs/t_handbook1/app/controllers/ --------------------------------------------------------------- Possible Controllers based on your current database: 1. Books 2. BooksTags 3. Tags Enter a number from the list above, type in the name of another controller, or 'q' to exit [q] > 1 --------------------------------------------------------------- Baking BooksController --------------------------------------------------------------- Would you like to build your controller interactively? Warning: Choosing no will overwrite the BooksController. (y/n) [y] > y Would you like to use dynamic scaffolding? (y/n) [n] > n Would you like to create some basic class methods (index(), add(), view(), edit())? (y/n) [n] > y Would you like to create the basic class methods for admin routing? (y/n) [n] > n Would you like this controller to use other helpers besides HtmlHelper and FormHelper? (y/n) [n] > n Would you like this controller to use any components? (y/n) [n] > n Would you like to use Session flash messages? (y/n) [y] > n --------------------------------------------------------------- The following controller will be created: --------------------------------------------------------------- Controller Name: Books --------------------------------------------------------------- Look okay? (y/n) [y] > y Creating file /usr/local/apache2/htdocs/t_handbook1/app/controllers/books_controller.php File `/usr/local/apache2/htdocs/t_handbook1/app/controllers/books_controller.php` exists, overwrite? (y/n/q) [n] > y Wrote `/usr/local/apache2/htdocs/t_handbook1/app/controllers/books_controller.php` SimpleTest is not installed. Do you want to bake unit test files anyway? (y/n) [y] > n --------------------------------------------------------------- Interactive Bake Shell --------------------------------------------------------------- [D]atabase Configuration [M]odel [V]iew [C]ontroller [P]roject [F]ixture [T]est case [Q]uit What would you like to Bake? (D/M/V/C/P/F/T/Q) > v --------------------------------------------------------------- Bake View Path: /usr/local/apache2/htdocs/t_handbook1/app/views/ --------------------------------------------------------------- Possible Controllers based on your current database: 1. Books 2. BooksTags 3. Tags Enter a number from the list above, type in the name of another controller, or 'q' to exit [q] > 1 Would you like bake to build your views interactively? Warning: Choosing no will overwrite Books views if it exist. (y/n) [n] > y Would you like to create some CRUD views (index, add, view, edit) for this controller? NOTE: Before doing so, you'll need to create your controller and model classes (including associated models). (y/n) [y] > y Would you like to create the views for admin routing? (y/n) [n] > n Creating file /usr/local/apache2/htdocs/t_handbook1/app/views/books/index.ctp File `/usr/local/apache2/htdocs/t_handbook1/app/views/books/index.ctp` exists, overwrite? (y/n/q) [n] > y Wrote `/usr/local/apache2/htdocs/t_handbook1/app/views/books/index.ctp` Creating file /usr/local/apache2/htdocs/t_handbook1/app/views/books/view.ctp File `/usr/local/apache2/htdocs/t_handbook1/app/views/books/view.ctp` exists, overwrite? (y/n/q) [n] > y Wrote `/usr/local/apache2/htdocs/t_handbook1/app/views/books/view.ctp` Creating file /usr/local/apache2/htdocs/t_handbook1/app/views/books/add.ctp File `/usr/local/apache2/htdocs/t_handbook1/app/views/books/add.ctp` exists, overwrite? (y/n/q) [n] > y Wrote `/usr/local/apache2/htdocs/t_handbook1/app/views/books/add.ctp` Creating file /usr/local/apache2/htdocs/t_handbook1/app/views/books/edit.ctp File `/usr/local/apache2/htdocs/t_handbook1/app/views/books/edit.ctp` exists, overwrite? (y/n/q) [n] > y Wrote `/usr/local/apache2/htdocs/t_handbook1/app/views/books/edit.ctp` --------------------------------------------------------------- View Scaffolding Complete.
В итоге мы получили базовый функционал для ввода категорий и записей в телефоный справочник, где для абонента можно указать любое количество категорий с помощьюю элемента "select" с возможность множественного выбора.
В следующей части будет рассказано как доделать наше приложение для работы с Ajax.