<?xml version="1.0" encoding="windows-1251"?>
<rss version="2.0">
<channel>
<title>CakePHP - Manual11/Models</title>
<link>http://cake-php.ru/wiki/Manual11/Models</link>
<description>History/revisions of CakePHP/Manual11/Models</description>
<language>en-us</language>
<item>
<title>2008-04-09 13:52:38</title>
<link>http://cake-php.ru/wiki/Manual11/Models/show?time=2008-04-09+13%3A52%3A38</link>
<description>&lt;div class="pageBefore">&lt;img src="http://cake-php.ru/wiki/images/z.gif" width="1" height="1" border="0" alt="" style="display:block" align="top" />&lt;/div>&lt;div class="page">
&lt;b>Сравнение версий &lt;a name=".manual11.models" href="http://cake-php.ru/wiki/Manual11/Models" class="">/Manual&amp;nbsp;11&amp;nbsp;/&amp;nbsp;Models&lt;/a> за &lt;a href="http://cake-php.ru/wiki/Manual11/Models?time=2008-04-09+13%3A52%3A38">2008-04-09 13:52:38&lt;/a> и &lt;a href="http://cake-php.ru/wiki/Manual11/Models">2008-04-22 00:05:21&lt;/a>&lt;/b>&lt;br />
&lt;br />
&lt;b>Добавлено:&lt;/b>&lt;br />
&lt;div class="additions">Модель это&amp;nbsp;общая точка доступа к&amp;nbsp;базе данных, а&amp;nbsp;именно, к&amp;nbsp;определенной таблице в&amp;nbsp;базе данных. По&amp;nbsp;умолчанию, каждая модель использует таблицу, чье&amp;nbsp;имя &amp;ndash; это&amp;nbsp;множественное число от&amp;nbsp;имени модели, например: модель 'User' использует таблицу 'users'. Модель может также включать в&amp;nbsp;себя правила верификации данных, информацию об&amp;nbsp;ассоциациях, и&amp;nbsp;индивидуальные методы к&amp;nbsp;таблице, которую использует. Вот&amp;nbsp;как простая модель 'User' может выглядеть в&amp;nbsp;Cake:&lt;br />
&lt;div class="indent">&lt;div class="indent">// Это&amp;nbsp;используется для&amp;nbsp;верификации данных, подробнее в&amp;nbsp;соответствующей главе.&lt;/div>&lt;/div>
Этот раздел будет рассказывать о&amp;nbsp;самых часто используемых функциях моделей Cake, не&amp;nbsp;стоит забывать, что&amp;nbsp;полезно использовать &lt;a href="http://api.cakephp.org" target="_blank" title="Внешняя ссылка (откроется в новом окне)" class="outerlink">&lt;img src="http://cake-php.ru/wiki/themes/cake/icons/web.gif" alt="" border="0" />http://api.cakephp.org&lt;/a> для&amp;nbsp;полной справки.&lt;br />
Пример индивидуального метода таблицы в&amp;nbsp;модели &amp;ndash; это&amp;nbsp;пара методов для&amp;nbsp;скрытия/отображения постов в&amp;nbsp;блоге&lt;br />
Возвращает определенные поля количеством не&amp;nbsp;больше $limit, соответствующих $conditions, начинается просмотр со&amp;nbsp;страницы $page (по умолчанию 1). $conditions должна выглядеть как&amp;nbsp;бы&amp;nbsp;она выглядела в&amp;nbsp;SQL-запросе: $conditions="race='wookie' AND&amp;nbsp;thermal_detonators &amp;gt; 3&amp;quot;, например.&lt;br />
Возвращает массив с&amp;nbsp;соседними моделями (только с&amp;nbsp;определенными полями), определенными по $field и $value, отсортированными по&amp;nbsp;SQL-условиям, $conditions.&lt;br />
Это&amp;nbsp;дает полный массив $image['Image'], вместе с $neighbours['prev']['Image']['id'] и $neighbours['next']['Image']['id'] в&amp;nbsp;нашем отображении.&lt;br />
Настраиваемые SQL-запросы можно сделать, используя query() и&amp;nbsp;методы execute() модели. Разница между ними в&amp;nbsp;том, что&amp;nbsp;query() используется для&amp;nbsp;настройки SQL-запросов (результаты которой возвращаются), а&amp;nbsp;execute() используется для&amp;nbsp;настройки SQL-команд (которые не&amp;nbsp;требует возврата результатов).&lt;a name="h25-1">&lt;/a>&lt;h3>Сложные условия поиска (используя массивы)&lt;/h3>
Большинство модельных поисковиков подразумевают вовлечение пересылки параметров условий разными способами. Простейший способ приблизиться к&amp;nbsp;этому &amp;ndash; использовать фрагмент SQL-выражения WHERE, но&amp;nbsp;если вам&amp;nbsp;нужно больше контроля, вы&amp;nbsp;можете использовать массивы. Массивы яснее и&amp;nbsp;легче читать, а&amp;nbsp;также легче строить запросы. Этот синтаксис также разбивает элементы запроса (поля, значения, операторы и&amp;nbsp;т.д.) на&amp;nbsp;более понятные, манипулируемые части. Это&amp;nbsp;позволяет Cake генерировать более результативные запросы, гарантируя подходящий синтаксис SQL.&lt;br />
Самое простой массивный запрос выглядит так:&lt;br />
%%//Пример использования самых простых условий поиска используя массив:&lt;br />
Структура даже не&amp;nbsp;требует объяснений: это&amp;nbsp;найдет любой пост, название которого будет соответствовать &amp;#147;This is&amp;nbsp;a post&amp;#148;. Отметьте, что&amp;nbsp;мы&amp;nbsp;могли использовать только &amp;#147;title&amp;#148; как&amp;nbsp;имя поля, но&amp;nbsp;создавая запросы, полезно указывать и&amp;nbsp;имя модели, так&amp;nbsp;как это&amp;nbsp;улучшает четкость кода и&amp;nbsp;помогает предотвратить несостыковки в&amp;nbsp;будущем. Что&amp;nbsp;насчет других типов соответствий? Все&amp;nbsp;так же&amp;nbsp;просто. Скажем мы&amp;nbsp;хотим найти все&amp;nbsp;посты где&amp;nbsp;в&amp;nbsp;названии &lt;strong>нет&lt;/strong> &amp;#147;This is&amp;nbsp;a post&amp;#148;:&lt;br />
Все&amp;nbsp;что мы&amp;nbsp;добавили это&amp;nbsp;'&amp;lt;&amp;gt;' перед выражением. Cake может проанализировать любой действительный оператор SQL, включая выражения как&amp;nbsp;LIKE, BETWEEN или&amp;nbsp;REGEX, так&amp;nbsp;же&amp;nbsp;как вы&amp;nbsp;оставляете место между оператором и&amp;nbsp;выражением или&amp;nbsp;значением. Одно исключение в&amp;nbsp;стиле (...) соответствия. Скажем вы&amp;nbsp;хотите найти посты, названия которых соответствуют одному из&amp;nbsp;списка значений:&lt;br />
Добавление дополнительных фильтров в&amp;nbsp;условия это&amp;nbsp;так же&amp;nbsp;просто как&amp;nbsp;добавления дополнительных пар&amp;nbsp;ключ/значение в&amp;nbsp;массив:&lt;br />
По&amp;nbsp;умолчанию, Cake добавляет многократные условия с&amp;nbsp;логическим AND; что&amp;nbsp;значит, фрагмент ниже будет соответствовать только постам, что&amp;nbsp;были созданы в&amp;nbsp;прошедшие две&amp;nbsp;недели, и&amp;nbsp;название которых соответствуют одному из&amp;nbsp;данных. Однако, мы&amp;nbsp;можем также легко найти посты, соответствующие любому условию:&lt;br />
Cake принимает все&amp;nbsp;действующие логические операторы SQL, включая AND, OR, NOT, XOR&amp;nbsp;и&amp;nbsp;т.д., и&amp;nbsp;они могут быть в&amp;nbsp;верхнем или&amp;nbsp;нижнем регистре, как&amp;nbsp;вам больше нравится. Скажем у&amp;nbsp;вас есть hasMany/belongsTo отношения между Posts и&amp;nbsp;Authors, результат поиска в&amp;nbsp;Posts будет в&amp;nbsp;LEFT JOIN. Скажем, вы&amp;nbsp;хотите найти все&amp;nbsp;посты, что&amp;nbsp;содержат ключевое слово или&amp;nbsp;которые были созданы в&amp;nbsp;прошедшие две&amp;nbsp;недели, но&amp;nbsp;вы хотите ограничиться постами, написанными Бобом:&lt;br />
Форма данных автоматически форматируется и&amp;nbsp;помещается в $this-&amp;gt;data в&amp;nbsp;ваш контроллер, так&amp;nbsp;что сохранение ваших данных из&amp;nbsp;веб-формы &amp;ndash; это&amp;nbsp;дело одного клика. Функция редактирования для&amp;nbsp;вашего собственного контроллера может выглядеть так:&lt;br />
Если эта&amp;nbsp;модель ассоциирована с&amp;nbsp;другими моделями, и&amp;nbsp;ключ зависимости был&amp;nbsp;установлен в&amp;nbsp;ассоциативном массиве, этот метод также удалил те&amp;nbsp;ассоциативные модели, если $cascade присвоено значение true.&lt;br />
beforeFind() колбек вызывается сразу перед началом операции поиска. Поместить любой передающий поиску код&amp;nbsp;сюда. Когда вы&amp;nbsp;перепишете это&amp;nbsp;в&amp;nbsp;свою модель, верните значение true, когда захотите чтобы начался поиск, или&amp;nbsp;false, когда захотите отменить его.&lt;br />
Поместите любой передающий сохранению код&amp;nbsp;в&amp;nbsp;эту функцию. Эта&amp;nbsp;функция выполняется сразу после проверки данных (только в&amp;nbsp;случае что&amp;nbsp;данные были проверены, иначе save() отменяется, а&amp;nbsp;этот колбек не&amp;nbsp;выполняется), но&amp;nbsp;перед тем&amp;nbsp;как данные сохранены. Это&amp;nbsp;функция также должна возвращать true если вы&amp;nbsp;хотите, чтобы операция сохранения продолжалась, и&amp;nbsp;false если хотите чтобы была отменена.&lt;br />
Одним из&amp;nbsp;использований beforeSave может быть формирования времени и&amp;nbsp;даты для&amp;nbsp;сохранения в&amp;nbsp;специфическом месте базы данных:&lt;br />
Поместите любой передающий удалению код&amp;nbsp;в&amp;nbsp;эту функцию. Это&amp;nbsp;функция должна возвращать true если вы&amp;nbsp;хотите чтобы удаление продолжилось или&amp;nbsp;false, чтобы отменилось.&lt;br />
Массив, используемый для&amp;nbsp;проверки входящих в&amp;nbsp;эту модель данных. См. главу &amp;laquo;Верификация данных&amp;raquo;.&lt;br />
Помните что&amp;nbsp;настройки базы данных можно устанавливать в&amp;nbsp;/app/config/database.php? Используйте эту&amp;nbsp;переменную, чтобы переключаться между ними &amp;ndash; просто используйте имя&amp;nbsp;переменной с&amp;nbsp;настройками соединения с&amp;nbsp;базой данных, которую вы&amp;nbsp;создали в&amp;nbsp;конфигурационном файле. По&amp;nbsp;умолчанию, вы&amp;nbsp;должны были догадаться, 'default'.&lt;br />
Чтобы корректно использовать ассоциации, лучше следовать схеме присвоения имен &lt;span class="missingpage">Cake&amp;nbsp;PHP&lt;/span>&lt;a href="http://cake-php.ru/wiki/CakePHP/edit?add=1" title="Создать эту страницу">?&lt;/a>. Если вы&amp;nbsp;следуете этой схеме, вы&amp;nbsp;можете пользоваться скаффолдингом для&amp;nbsp;визуализации данных вашего приложения, потому что&amp;nbsp;скаффолдинг вылавливает и&amp;nbsp;использует ассоциации между моделями. Конечно же&amp;nbsp;вы всегда можете настроить ассоциации моделей для&amp;nbsp;работы, если не&amp;nbsp;используете схему присвоения имен &lt;span class="missingpage">Cake&amp;nbsp;PHP&lt;/span>&lt;a href="http://cake-php.ru/wiki/CakePHP/edit?add=1" title="Создать эту страницу">?&lt;/a>, но&amp;nbsp;мы прибережем эти&amp;nbsp;советы на&amp;nbsp;потом. А&amp;nbsp;пока, давайте просто следовать схеме. Схема присвоения имен, которая нас&amp;nbsp;волнует &amp;ndash; это&amp;nbsp;сторонние ключи, имена моделей и&amp;nbsp;таблиц.&lt;br />
Чтобы установить эту&amp;nbsp;ассоциацию, мы&amp;nbsp;предполагаем что&amp;nbsp;вы&amp;nbsp;уже создали модели User и&amp;nbsp;Profile. Чтобы объявить hasOne-ассоциацию между ними, нам&amp;nbsp;понадобится добавить массив к&amp;nbsp;модели, чтобы сообщить Cake'у как&amp;nbsp;они будут относится. Вот&amp;nbsp;как это&amp;nbsp;выглядит:&lt;br />
Массив $hasOne это&amp;nbsp;то, что&amp;nbsp;Cake использует для&amp;nbsp;создания ассоциации между User и&amp;nbsp;Profile моделями. Каждый ключ в&amp;nbsp;массиве позволяет настроить ассоциацию:&lt;br />
&lt;ol type="3">&lt;li> order: упорядочивание ассоциируемых моделей. Если мы&amp;nbsp;хотим присвоить специфический порядок ассоциируемым моделям, устанавливает значение этого ключа, используя выражение упорядочивания SQL: "&lt;span class="missingpage">Profile.name&lt;/span>&lt;a href="http://cake-php.ru/wiki/Profile/name/edit?add=1" title="Создать эту страницу">?&lt;/a> ASC", например.
&lt;/li>&lt;li> dependent: если установлено true, то&amp;nbsp;ассоциируемая модель уничтожается, когда уничтожается первая. Например, если профиль &amp;#147;Cool Blue&amp;#148; ассоциирован с&amp;nbsp;&amp;#147;Bob&amp;#148;, и&amp;nbsp;я удаляю пользователя &amp;#147;Bob&amp;#148;, профиль &amp;#147;Cool Blue&amp;#148; тоже удаляется.
&lt;/li>&lt;li> foreignKey: имя&amp;nbsp;стороннего ключа, что&amp;nbsp;указывает на&amp;nbsp;ассоциируемую модель. Вот&amp;nbsp;оно, если вы&amp;nbsp;используете базу данных, не&amp;nbsp;следуя схеме присвоения имен &lt;span class="missingpage">Cake&amp;nbsp;PHP&lt;/span>&lt;a href="http://cake-php.ru/wiki/CakePHP/edit?add=1" title="Создать эту страницу">?&lt;/a>.&lt;/li>&lt;/ol>
Теперь пользователь может увидеть свой профиль, нам&amp;nbsp;нужно объявить ассоциацию так, чтобы пользователь мог&amp;nbsp;видеть только свой профиль. Это&amp;nbsp;делается использованием типа ассоциаций belongsTo. В&amp;nbsp;модели Profile, мы&amp;nbsp;делаем следующее:&lt;br />
Массив $belongsTo это&amp;nbsp;то, что&amp;nbsp;Cake использует для&amp;nbsp;создания ассоциаций между User и&amp;nbsp;Profile моделями. Каждый ключ в&amp;nbsp;массиве позволяет вам&amp;nbsp;настраивать ассоциацию:&lt;br />
&lt;ol type="3">&lt;li> order: упорядочивание ассоциируемых моделей. Если вы&amp;nbsp;хотите придать специфическое упорядочивание ассоциируемым моделям, установите значение для&amp;nbsp;этого ключа, используя выражения SQL&amp;nbsp;для упорядочивания: "&lt;span class="missingpage">User.last_name&lt;/span>&lt;a href="http://cake-php.ru/wiki/User/lastname/edit?add=1" title="Создать эту страницу">?&lt;/a> ASC", например.&lt;/li>&lt;/ol>
Теперь, когда мы&amp;nbsp;выполняем запросы find() или&amp;nbsp;findAll(), используя Profile модель, мы&amp;nbsp;должны увидеть нашу ассоциированную модель User:&lt;br />
Массив $hasMany это&amp;nbsp;то, что&amp;nbsp;использует Cake для&amp;nbsp;создания ассоциаций между User и&amp;nbsp;Comment моделями. Каждый ключ массива позволяет вам&amp;nbsp;настроить ассоциацию:&lt;br />
&lt;ol type="3">&lt;li> order: упорядочивание ассоциируемых моделей. Если вы&amp;nbsp;хотите придать специфическое упорядочивание ассоциируемым моделям, установите значение ключа, используя SQL-выражения для&amp;nbsp;упорядочивания: "&lt;span class="missingpage">Comment.created&lt;/span>&lt;a href="http://cake-php.ru/wiki/Comment/created/edit?add=1" title="Создать эту страницу">?&lt;/a> DESC", например.
&lt;/li>&lt;li> dependent: если установлено значение true, то&amp;nbsp;ассоциируемая модель будет удалена в&amp;nbsp;случае, если будет удалена первая. К&amp;nbsp;примеру есть профиль &amp;#147;Cool Blue&amp;#148; ассоциированный с&amp;nbsp;&amp;#147;Bob&amp;#148;, и&amp;nbsp;я удаляю пользователя &amp;#147;Bob&amp;#148;, профиль &amp;#147;Cool Blue&amp;#148; тоже будет удален.
&lt;/li>&lt;li> exclusive: Если установлено значение true, все&amp;nbsp;ассоциированные объекты будут удалены во&amp;nbsp;время одного запроса SQL&amp;nbsp;минуя их&amp;nbsp;beforeDelete колбек. Полезно для&amp;nbsp;более простых ассоциаций, потому что&amp;nbsp;это может быть намного быстрее.&lt;/li>&lt;/ol>
Теперь когда мы&amp;nbsp;выполняем запросы find() и&amp;nbsp;findAll(), используя модель User, мы&amp;nbsp;должны увидеть все&amp;nbsp;ассоциированные комментарии:&lt;br />
Хоть мы&amp;nbsp;и не&amp;nbsp;документируем процесс, но&amp;nbsp;было бы&amp;nbsp;очень полезно объявить ассоциацию Comment belongsTo User, чтобы каждая из&amp;nbsp;моделей видела друг друга.&lt;br />
Связные таблицы HABTM должны состоять минимум из&amp;nbsp;двух сторонних ключей моделей, которые они&amp;nbsp;связывают. Для&amp;nbsp;нашего примера, &amp;#147;post_id&amp;#148; и&amp;nbsp;&amp;#147;tag_id&amp;#148; это&amp;nbsp;все что&amp;nbsp;нам нужно.&lt;br />
Вот&amp;nbsp;как будут выглядеть дампы SQL&amp;nbsp;для нашего Posts HABTM Tags примера:&lt;br />
Массив $hasAndBelongsToMany это&amp;nbsp;что Cake использует для&amp;nbsp;создания ассоциации между моделями Post и&amp;nbsp;Tag. Каждый ключ таблицы позволяет вам&amp;nbsp;настроить ассоциацию:&lt;br />
&lt;ol type="6">&lt;li> order: упорядочивание ассоциируемых моделей. Если вы&amp;nbsp;хотите придать определенное упорядочивание ассоциируемым моделям, установите значение ключа, используя выражения SQL&amp;nbsp;для упорядочивания: "&lt;span class="missingpage">Tag.tag&lt;/span>&lt;a href="http://cake-php.ru/wiki/Tag/tag/edit?add=1" title="Создать эту страницу">?&lt;/a> DESC", например.
&lt;/li>&lt;li> limit: максимальное количество ассоциируемых моделей, которое вы&amp;nbsp;хотите чтобы Cake добавил в&amp;nbsp;выборку. Используется, чтобы ограничить число ассоциируемых тегов, которые будут в&amp;nbsp;выборке.
&lt;/li>&lt;li> unique: если установлено значение true, дублирование ассоциируемых объектов будет игнорироваться средствами доступа и&amp;nbsp;запросами. В&amp;nbsp;основном если ассоциации отдельные, устанавливайте true. В&amp;nbsp;этом случае тег&amp;nbsp;&amp;#147;Awesomeness&amp;#148; может быть приписать только посту &amp;#147;Cake Model Assosiations&amp;#148; и&amp;nbsp;только раз, и&amp;nbsp;будет виден только единожды в&amp;nbsp;масиве результатов.&lt;/li>&lt;/ol>&lt;a name="h25-2">&lt;/a>&lt;h3>Сохранение данных ассоциируемых моделей&lt;/h3>
Сохранение моделей, которые ассоциированы типами hasOne, belongTo и&amp;nbsp;hasMany довольно просто: вы&amp;nbsp;просто заполняете поле стороннего ключа ассоциированной модели. Когда это&amp;nbsp;сделано вы&amp;nbsp;просто делаете запрос save() на&amp;nbsp;модели, и&amp;nbsp;все связано корректно.&lt;br />
Для&amp;nbsp;запроса $this-&amp;gt;Post-&amp;gt;save() в&amp;nbsp;контроллере, чтобы сохранить связи между этим новым постом и&amp;nbsp;ассоциацией с&amp;nbsp;тегами, имя&amp;nbsp;поля должно быть в&amp;nbsp;форме "&lt;span class="missingpage">Tag&amp;nbsp;/&amp;nbsp;Tag&lt;/span>&lt;a href="http://cake-php.ru/wiki/Tag/Tag/edit?add=1" title="Создать эту страницу">?&lt;/a>" (отображаемое имя&amp;nbsp;атрибута будет выглядеть как&amp;nbsp;'data[ИмяМодели][ИмяМодели][]'). Подтвержденные данные должны быть одним ID&amp;nbsp;или массивом ID-номеров связанных записей. Поскольку мы&amp;nbsp;используем возможность выбора не&amp;nbsp;одного тега, то&amp;nbsp;подтвержденные данные для&amp;nbsp;&lt;span class="missingpage">Tag&amp;nbsp;/&amp;nbsp;Tag&lt;/span>&lt;a href="http://cake-php.ru/wiki/Tag/Tag/edit?add=1" title="Создать эту страницу">?&lt;/a> будут массивом ID-номеров.&lt;br />
Переменная $tags здесь &amp;ndash; просто массив где&amp;nbsp;ключи это&amp;nbsp;ID-номера возможных тегов, а&amp;nbsp;значения это&amp;nbsp;отображаемые имена тегов в&amp;nbsp;многоэлементном выборе.&lt;br />
Смена ассоциаций на&amp;nbsp;лету, используя bindModel() и&amp;nbsp;unbindModel()&lt;br />
Вы&amp;nbsp;можете случайно захотеть изменить информацию об&amp;nbsp;ассоциациях моделей в&amp;nbsp;необычных ситуациях, пока создаете свое приложение. Если настройка ассоциаций в&amp;nbsp;файле модели дает слишком много (или недостаточно) информации, вы&amp;nbsp;можете использовать две&amp;nbsp;функции моделей чтобы связать и&amp;nbsp;развязать ассоциации моделей.&lt;br />
Теперь, в&amp;nbsp;&lt;span class="missingpage">Leader&amp;nbsp;Controller&lt;/span>&lt;a href="http://cake-php.ru/wiki/LeaderController/edit?add=1" title="Создать эту страницу">?&lt;/a>, мы&amp;nbsp;можем использовать find() в&amp;nbsp;модели Leader. Как&amp;nbsp;вы&amp;nbsp;можете увидеть выше, ассоциативный массив в&amp;nbsp;модели Leader объявляет ассоциацию &amp;#147;Leader hasMany Followers&amp;#148;. Для&amp;nbsp;демонстрации замысла давайте используем unbindModel() чтобы убрать эту&amp;nbsp;ассоциацию.&lt;br />
&lt;div class="indent">&lt;div class="indent">//Теперь когда мы&amp;nbsp;сделали корректную ассоциацию, мы&amp;nbsp;можем использовать простую функцию поиска&lt;/div>&lt;/div>
Вот&amp;nbsp;теперь это&amp;nbsp;есть у&amp;nbsp;вас. Основное использование bindModel это&amp;nbsp;герметизация обычного ассоциативного массива внутрь массива, чьи&amp;nbsp;ключи названы после типа ассоциации, которую вы&amp;nbsp;пытаетесь создать:&lt;br />
Пожалуйста заметьте что&amp;nbsp;в&amp;nbsp;ваших таблицах должны быть корректно прописаны ключи (или ассоциативные массивы соответственно настроенные) чтобы связывать модели на&amp;nbsp;лету.&lt;/div>&lt;br />
&lt;b>Удалено:&lt;/b>&lt;br />
&lt;div class="deletions">Модель это&amp;nbsp;общая точка доступа к&amp;nbsp;базе данных, а&amp;nbsp;именно, к&amp;nbsp;определенной таблице в&amp;nbsp;базе данных. По&amp;nbsp;умолчанию, каждая модель использует таблицу, чье&amp;nbsp;имя &amp;ndash; это&amp;nbsp;множественное число от&amp;nbsp;имени модели, например: модель 'User' использует таблицу 'users'. Модель может также включать в&amp;nbsp;себя правила верификации данных, информацию об&amp;nbsp;ассоциациях, и&amp;nbsp;индивидуальные методы к&amp;nbsp;таблице, которую использует. Вот&amp;nbsp;как простая модель 'User' может выглядить в&amp;nbsp;Cake:&lt;br />
&lt;div class="indent">&lt;div class="indent">// Это&amp;nbsp;используется для&amp;nbsp;верификации данных, подробнее в&amp;nbsp;соответсвующей главе.&lt;/div>&lt;/div>
Этот раздел будет рассказывать о&amp;nbsp;самых частоиспользуемых функциях моделей Cake, не&amp;nbsp;стоит забывать, что&amp;nbsp;полезно использовать &lt;a href="http://api.cakephp.org" target="_blank" title="Внешняя ссылка (откроется в новом окне)" class="outerlink">&lt;img src="http://cake-php.ru/wiki/themes/cake/icons/web.gif" alt="" border="0" />http://api.cakephp.org&lt;/a> для&amp;nbsp;полной справки.&lt;br />
Пример индивидуального метода таблицы в&amp;nbsp;модели &amp;ndash; это&amp;nbsp;пара методов для&amp;nbsp;скрывания/отображения постов в&amp;nbsp;блоге&lt;br />
Возвращает определенные поля количеством не&amp;nbsp;больше $limit, соответсвующих $conditions, начинается просмотр со&amp;nbsp;страницы $page (по умолчанию 1). $conditions должна выглядить как&amp;nbsp;бы&amp;nbsp;она выглядела в&amp;nbsp;SQL-запросе: $conditions="race='wookie' AND&amp;nbsp;thermal_detonators &amp;gt; 3&amp;quot;, например.&lt;br />
Вовзращает масив с&amp;nbsp;соседними моделями (только с&amp;nbsp;определенными полями), определенными по $field и $value, отсортированными по&amp;nbsp;SQL-условиям, $conditions.&lt;br />
Это&amp;nbsp;дает полный масив $image['Image'], вместе с $neighbours['prev']['Image']['id'] и $neighbours['next']['Image']['id'] в&amp;nbsp;нашем отображении.&lt;br />
Настраеваемые SQL-запросы можно сделать, используя query() и&amp;nbsp;методы execute() модели. Разница между ними в&amp;nbsp;том, что&amp;nbsp;query() используется для&amp;nbsp;настройки SQL-запросов (результаты которой возвращаются), а&amp;nbsp;execute() используется для&amp;nbsp;настройки SQL-команд (которые не&amp;nbsp;требует возврата результатов).&lt;a name="h25-1">&lt;/a>&lt;h3>Сложные условия поиска (используя масивы)&lt;/h3>
Большинство модельных поисковиков подразумевают вовлечение пересылки параметров условий разными способами. Простейший способ приблизиться к&amp;nbsp;этому &amp;ndash; использовать фрагмент SQL-выражения WHERE, но&amp;nbsp;если вам&amp;nbsp;нужно больше контроля, вы&amp;nbsp;можете использовать масивы. Масивы яснее и&amp;nbsp;легче читать, а&amp;nbsp;также легче строить запросы. Этот синтаксис также разбивает элементы запроса (поля, значения, операторы и&amp;nbsp;т.д.) на&amp;nbsp;более понятные, манипулируемые части. Это&amp;nbsp;позволяет Cake генерировать более результативные запросы, гарантируя подходящий синтаксис SQL.&lt;br />
Самое простой масивный запрос выглядит так:&lt;br />
%%//Пример использования самых простых условий поиска используя масив:&lt;br />
Структура даже не&amp;nbsp;требует объяснений: это&amp;nbsp;найдет любой пост, название которого будет соответсвовать &amp;#147;This is&amp;nbsp;a post&amp;#148;. Отметьте, что&amp;nbsp;мы&amp;nbsp;могли использовать только &amp;#147;title&amp;#148; как&amp;nbsp;имя поля, но&amp;nbsp;создавая запросы, полезно указывать и&amp;nbsp;имя модели, так&amp;nbsp;как это&amp;nbsp;улучшает четкость кода и&amp;nbsp;помогает предотвратить несостыковки в&amp;nbsp;будущем. Что&amp;nbsp;насчет других типов соответствий? Все&amp;nbsp;так же&amp;nbsp;просто. Скажем мы&amp;nbsp;хотим найти все&amp;nbsp;посты где&amp;nbsp;в&amp;nbsp;названии &lt;strong>нет&lt;/strong> &amp;#147;This is&amp;nbsp;a post&amp;#148;:&lt;br />
Все&amp;nbsp;что мы&amp;nbsp;добавили это&amp;nbsp;'&amp;lt;&amp;gt;' перед выражением. Cake может проанализировать любой действительный оператор SQL, включая выражения как&amp;nbsp;LIKE, BETWEEN или&amp;nbsp;REGEX, так&amp;nbsp;же&amp;nbsp;как вы&amp;nbsp;оставляете место между оператором и&amp;nbsp;выражением или&amp;nbsp;значением. Одно исключение в&amp;nbsp;стиле (...) соответсвия. Скажем вы&amp;nbsp;хотите найти посты, названия которых соответсвуют одному из&amp;nbsp;списка значений:&lt;br />
Добавление дополнительных фильтров в&amp;nbsp;условия это&amp;nbsp;так же&amp;nbsp;просто как&amp;nbsp;добавления дополнительных пар&amp;nbsp;ключ/значение в&amp;nbsp;масив:&lt;br />
По&amp;nbsp;умолчанию, Cake добавляет многократные условия с&amp;nbsp;логическим AND; что&amp;nbsp;значит, фрагмент ниже будет соответствовать только постам, что&amp;nbsp;были созданы в&amp;nbsp;прошедшие две&amp;nbsp;недели, и&amp;nbsp;название которых соответсвуют одному из&amp;nbsp;данных. Однако, мы&amp;nbsp;можем также легко найти посты, соответсвующие любому условию:&lt;br />
Cake примает все&amp;nbsp;действующие логические операторы SQL, включая AND, OR, NOT, XOR&amp;nbsp;и&amp;nbsp;т.д., и&amp;nbsp;они могут быть в&amp;nbsp;верхнем или&amp;nbsp;нижнем регистре, как&amp;nbsp;вам больше нравится. Скажем у&amp;nbsp;вас есть hasMany/belongsTo отношения между Posts и&amp;nbsp;Authors, результат поиска в&amp;nbsp;Posts будет в&amp;nbsp;LEFT JOIN. Скажем, вы&amp;nbsp;хотите найти все&amp;nbsp;посты, что&amp;nbsp;содержат ключевое слово или&amp;nbsp;которые были созданы в&amp;nbsp;прошедшие две&amp;nbsp;недели, но&amp;nbsp;вы хотите ограничиться постами, написанными Бобом:&lt;br />
Форма данных автоматически форматируется и&amp;nbsp;помещается в $this-&amp;gt;data в&amp;nbsp;ваш контроллер, так&amp;nbsp;что сохранение ваших данных из&amp;nbsp;веб-формы &amp;ndash; это&amp;nbsp;дело одного клика. Функция редактирования для&amp;nbsp;вашего собственного контроллера может выглядить так:&lt;br />
Если эта&amp;nbsp;модель ассоциирована с&amp;nbsp;другими моделями, и&amp;nbsp;ключ зависимости был&amp;nbsp;установлен в&amp;nbsp;ассоциативном масиве, этот метод также удалил те&amp;nbsp;ассоциативные модели, если $cascade присвоено значение true.&lt;br />
beforeFind() колбек вызывается сразу перед началом операции поиска. Поместить любой передующий поиску код&amp;nbsp;сюда. Когда вы&amp;nbsp;перепишете это&amp;nbsp;в&amp;nbsp;свою модель, верните значение true, когда захотите чтобы начался поиск, или&amp;nbsp;false, когда захотите отменить его.&lt;br />
Поместите любой передующий сохранению код&amp;nbsp;в&amp;nbsp;эту функцию. Эта&amp;nbsp;функция выполняется сразу после проверки данных (только в&amp;nbsp;случае что&amp;nbsp;данные были проверены, иначе save() отменяется, а&amp;nbsp;этот колбек не&amp;nbsp;выполняется), но&amp;nbsp;перед тем&amp;nbsp;как данные сохранены. Это&amp;nbsp;функция также должна возвращать true если вы&amp;nbsp;хотите, чтобы операция сохранения продолжалась, и&amp;nbsp;false если хотите чтобы была отменена.&lt;br />
Одно из&amp;nbsp;использований beforeSave может быть формирования времени и&amp;nbsp;даты для&amp;nbsp;сохранения в&amp;nbsp;специфическом месте базы данных:&lt;br />
Поместите любой передующий удалению код&amp;nbsp;в&amp;nbsp;эту функцию.Это функция должна возвращать true если вы&amp;nbsp;хотите чтобы удаление продолжилось или&amp;nbsp;false, чтобы отменилось.&lt;br />
Масив, используемый для&amp;nbsp;проверки входящих в&amp;nbsp;эту модель данных. См. главу &amp;laquo;Верификация данных&amp;raquo;.&lt;br />
Помниче что&amp;nbsp;настройки базы данных можно устанавливать в&amp;nbsp;/app/config/database.php? Используйте эту&amp;nbsp;переменную, чтобы переключаться между ними &amp;ndash; просто используйте имя&amp;nbsp;переменной с&amp;nbsp;настройками соединения с&amp;nbsp;базой данных, которую вы&amp;nbsp;создали в&amp;nbsp;конфигурационном файле. По&amp;nbsp;умолчанию, вы&amp;nbsp;должны были догадаться, 'default'.&lt;br />
Чтобы коректно использовать ассоциации, лучше следовать схеме присвоения имен &lt;span class="missingpage">Cake&amp;nbsp;PHP&lt;/span>&lt;a href="http://cake-php.ru/wiki/CakePHP/edit?add=1" title="Создать эту страницу">?&lt;/a>. Если вы&amp;nbsp;следуете этой схеме, вы&amp;nbsp;можете пользоваться скаффолдингом для&amp;nbsp;визуализации данных вашего приложения, потому что&amp;nbsp;скаффолдинг вылавливает и&amp;nbsp;использует ассоциации между моделями. Конечно же&amp;nbsp;вы всегда можете настроить ассоциации моделей для&amp;nbsp;работы, если не&amp;nbsp;используете схему присвоения имен &lt;span class="missingpage">Cake&amp;nbsp;PHP&lt;/span>&lt;a href="http://cake-php.ru/wiki/CakePHP/edit?add=1" title="Создать эту страницу">?&lt;/a>, но&amp;nbsp;мы прибережем эти&amp;nbsp;советы на&amp;nbsp;потом. А&amp;nbsp;пока, давайте просто следовать схеме. Схема присвоения имен, которая нас&amp;nbsp;волнует &amp;ndash; это&amp;nbsp;сторонние ключи, имена моделей и&amp;nbsp;таблиц.&lt;br />
Чтобы установить эту&amp;nbsp;ассоциацию, мы&amp;nbsp;предполагаем что&amp;nbsp;вы&amp;nbsp;уже создали модели User и&amp;nbsp;Profile. Чтобы объявить hasOne-ассоциацию между ними, нам&amp;nbsp;понадобится добавить масив к&amp;nbsp;модели, чтобы сообщить Cake'у как&amp;nbsp;они будут относится. Вот&amp;nbsp;как это&amp;nbsp;выглядит:&lt;br />
Масив $hasOne это&amp;nbsp;то, что&amp;nbsp;Cake использует для&amp;nbsp;создания ассоциации между User и&amp;nbsp;Profile моделями. Каждый ключ в&amp;nbsp;масиве позволяет настроить ассоциацию:&lt;br />
&lt;ol type="3">&lt;li> order: упорядочивание ассоциатируемых моделей. Если мы&amp;nbsp;хотим присвоить специфический порядок ассоциатируемым моделям, устанавливает значение этого ключа, используя выражение упорядочивания SQL: "&lt;span class="missingpage">Profile.name&lt;/span>&lt;a href="http://cake-php.ru/wiki/Profile/name/edit?add=1" title="Создать эту страницу">?&lt;/a> ASC", например.
&lt;/li>&lt;li> dependent: если установленно true, то&amp;nbsp;ассоциатируемая модель уничтожается, когда уничтожается первая. Например, если профиль &amp;#147;Cool Blue&amp;#148; ассоциатирован с&amp;nbsp;&amp;#147;Bob&amp;#148;, и&amp;nbsp;я удаляю пользователя &amp;#147;Bob&amp;#148;, профиль &amp;#147;Cool Blue&amp;#148; тоже удаляется.
&lt;/li>&lt;li> foreignKey: имя&amp;nbsp;стороннего ключа, что&amp;nbsp;указывает на&amp;nbsp;ассоциатируемую модель. Вот&amp;nbsp;оно, если вы&amp;nbsp;используете базу данных, не&amp;nbsp;следуя схеме присвоения имен &lt;span class="missingpage">Cake&amp;nbsp;PHP&lt;/span>&lt;a href="http://cake-php.ru/wiki/CakePHP/edit?add=1" title="Создать эту страницу">?&lt;/a>.&lt;/li>&lt;/ol>
Теперь пользователь может увидить свой профиль, нам&amp;nbsp;нужно объявить ассоциацию так, чтобы пользователь мог&amp;nbsp;видеть только свой профиль. Это&amp;nbsp;делается использованием типа ассоциаций belongsTo. В&amp;nbsp;модели Profile, мы&amp;nbsp;делаем следующее:&lt;br />
Масив $belongsTo это&amp;nbsp;то, что&amp;nbsp;Cake использует для&amp;nbsp;создания ассоциаций между User и&amp;nbsp;Profile моделями. Каждый ключ в&amp;nbsp;масиве позволяет вам&amp;nbsp;настраивать ассоциацию:&lt;br />
&lt;ol type="3">&lt;li> order: упорядочивание ассоциатируемых моделей. Если вы&amp;nbsp;хотите придать специфическое упорядочивание ассоциируемым моделям, установите значение для&amp;nbsp;этого ключа, используя выражения SQL&amp;nbsp;для упорядочивания: "&lt;span class="missingpage">User.last_name&lt;/span>&lt;a href="http://cake-php.ru/wiki/User/lastname/edit?add=1" title="Создать эту страницу">?&lt;/a> ASC", например.&lt;/li>&lt;/ol>
Теперь, когда мы&amp;nbsp;выполняем запросы find() или&amp;nbsp;findAll(), используя Profile модель, мы&amp;nbsp;должны увидить нашу ассоциированную модель User:&lt;br />
Масив $hasMany это&amp;nbsp;то, что&amp;nbsp;использует Cake для&amp;nbsp;создания ассоциаций между User и&amp;nbsp;Comment моделями. Каждый ключ масива позволяет вам&amp;nbsp;настроить ассоциацию:&lt;br />
&lt;ol type="3">&lt;li> order: упорядочивание ассоциатируемых моделей. Если вы&amp;nbsp;хотите придать специфическое упорядочивание ассоциируемым моделям, установите значение ключа, используя SQL-выражения для&amp;nbsp;упорядочивания: "&lt;span class="missingpage">Comment.created&lt;/span>&lt;a href="http://cake-php.ru/wiki/Comment/created/edit?add=1" title="Создать эту страницу">?&lt;/a> DESC", например.
&lt;/li>&lt;li> dependent: если установленно значение true, то&amp;nbsp;ассоциируемая модель будет удалена в&amp;nbsp;случае, если будет удалена первая. К&amp;nbsp;примеру есть профиль &amp;#147;Cool Blue&amp;#148; ассоциированный с&amp;nbsp;&amp;#147;Bob&amp;#148;, и&amp;nbsp;я удаляю пользователя &amp;#147;Bob&amp;#148;, профиль &amp;#147;Cool Blue&amp;#148; тоже будет удален.
&lt;/li>&lt;li> exclusive: Если установленно значение true, все&amp;nbsp;ассоциированные объекты будут удалены во&amp;nbsp;время одного запроса SQL&amp;nbsp;минуя их&amp;nbsp;beforeDelete колбек. Полезно для&amp;nbsp;более простых ассоциаций, потому что&amp;nbsp;это может быть намного быстрее.&lt;/li>&lt;/ol>
Теперь когда мы&amp;nbsp;выполняем запросы find() и&amp;nbsp;findAll(), используя модель User, мы&amp;nbsp;должны увидить все&amp;nbsp;ассоциированные комментарии:&lt;br />
Хоть мы&amp;nbsp;и не&amp;nbsp;документируем процес, но&amp;nbsp;было бы&amp;nbsp;очень полезно объявить ассоциацию Comment belongsTo User, чтобы каждая из&amp;nbsp;моделей видела друг друга.&lt;br />
Связные таблицы HABTM должны состояить минимум из&amp;nbsp;двух сторонних ключей моделей, которые они&amp;nbsp;связывают. Для&amp;nbsp;нашего примера, &amp;#147;post_id&amp;#148; и&amp;nbsp;&amp;#147;tag_id&amp;#148; это&amp;nbsp;все что&amp;nbsp;нам нужно.&lt;br />
Вот&amp;nbsp;как будут выглядить дампы SQL&amp;nbsp;для нашего Posts HABTM Tags примера:&lt;br />
Масив $hasAndBelongsToMany это&amp;nbsp;что Cake использует для&amp;nbsp;создания ассоциации между моделями Post и&amp;nbsp;Tag. Каждый ключ таблицы позволяет вам&amp;nbsp;настроить ассоциацию:&lt;br />
&lt;ol type="6">&lt;li> order: упорядочивание ассоциируемых моделей. Если вы&amp;nbsp;хотите придать определенное упорядочивание ассоциирумым моделям, установите значение ключа, используя выражения SQL&amp;nbsp;для упорядочивания: "&lt;span class="missingpage">Tag.tag&lt;/span>&lt;a href="http://cake-php.ru/wiki/Tag/tag/edit?add=1" title="Создать эту страницу">?&lt;/a> DESC", например.
&lt;/li>&lt;li> limit: максимальное количество ассоциирумых моделей, которое вы&amp;nbsp;хотите чтобы Cake добавил в&amp;nbsp;выборку. Используется, чтобы ограничить число ассоциируемых тегов, которые будут в&amp;nbsp;выборке.
&lt;/li>&lt;li> unique: если установлено значение true, дублирование ассоциированых объектов будет игнорироваться средствами доступа и&amp;nbsp;запросами. В&amp;nbsp;основном если ассоциации отдельные, устанавливайте true. В&amp;nbsp;этом случае тег&amp;nbsp;&amp;#147;Awesomeness&amp;#148; может быть приписат только посту &amp;#147;Cake Model Assosiations&amp;#148; и&amp;nbsp;только раз, и&amp;nbsp;будет виден только единожды в&amp;nbsp;масиве результатов.&lt;/li>&lt;/ol>&lt;a name="h25-2">&lt;/a>&lt;h3>Сохранение данных ассоциированых моделей&lt;/h3>
Сохранение моделей, которые ассоциированы типами hasOne, belongTo и&amp;nbsp;hasMany довольно просто: вы&amp;nbsp;просто заполняете поле стороннего ключа ассоциированной модели. Когда это&amp;nbsp;сделано вы&amp;nbsp;просто делаете запрос save() на&amp;nbsp;модели, и&amp;nbsp;все связано коректно.&lt;br />
Для&amp;nbsp;запроса $this-&amp;gt;Post-&amp;gt;save() в&amp;nbsp;контроллере, чтобы сохранить связи между этим новым постом и&amp;nbsp;ассоциацией с&amp;nbsp;тегами, имя&amp;nbsp;поля должно быть в&amp;nbsp;форме "&lt;span class="missingpage">Tag&amp;nbsp;/&amp;nbsp;Tag&lt;/span>&lt;a href="http://cake-php.ru/wiki/Tag/Tag/edit?add=1" title="Создать эту страницу">?&lt;/a>" (отображаемое имя&amp;nbsp;атрибута будет выглядить как&amp;nbsp;'data[ИмяМодели][ИмяМодели][]'). Подтвержденные данные должы быть одним ID&amp;nbsp;или масивом ID-номеров связанных записей. Поскольку мы&amp;nbsp;используем возможность выбора не&amp;nbsp;одного тега, то&amp;nbsp;подтвержденные данные для&amp;nbsp;&lt;span class="missingpage">Tag&amp;nbsp;/&amp;nbsp;Tag&lt;/span>&lt;a href="http://cake-php.ru/wiki/Tag/Tag/edit?add=1" title="Создать эту страницу">?&lt;/a> будут масивом ID-номеров.&lt;br />
Переменная $tags здесь &amp;ndash; просто масив где&amp;nbsp;ключи это&amp;nbsp;ID-номера возможных тегов, а&amp;nbsp;значения это&amp;nbsp;отображаемые имена тегов в&amp;nbsp;многоэлементном выборе.&lt;br />
Смена ассоцииаций на&amp;nbsp;лету, используя bindModel() и&amp;nbsp;unbindModel()&lt;br />
Вы&amp;nbsp;можете случайно захотеть изменить информацию об&amp;nbsp;ассоциациях моделей в&amp;nbsp;необычных ситуациях, пока создаете свое приложение. Если настройка ассоциаций в&amp;nbsp;файле модели дает слишком много (или недостаточно) информации, вы&amp;nbsp;можете использовать две&amp;nbsp;функции моделей чтобы связать и&amp;nbsp;развязать ассоцииации моделей.&lt;br />
Теперь, в&amp;nbsp;&lt;span class="missingpage">Leader&amp;nbsp;Controller&lt;/span>&lt;a href="http://cake-php.ru/wiki/LeaderController/edit?add=1" title="Создать эту страницу">?&lt;/a>, мы&amp;nbsp;можем использовать find() в&amp;nbsp;модели Leader. Как&amp;nbsp;вы&amp;nbsp;можете увидить выше, ассоциативный масив в&amp;nbsp;модели Leader объявляет ассоциацию &amp;#147;Leader hasMany Followers&amp;#148;. Для&amp;nbsp;демонстрации замысла давайте используем unbindModel() чтобы убрать эту&amp;nbsp;ассоциацию.&lt;br />
&lt;div class="indent">&lt;div class="indent">//Теперь когда мы&amp;nbsp;сделали коректную ассоциацию, мы&amp;nbsp;можем использовать простую функцию поиска&lt;/div>&lt;/div>
Вот&amp;nbsp;теперь это&amp;nbsp;есть у&amp;nbsp;вас. Основное использование bindModel это&amp;nbsp;герметизация обычного ассоциативного масива внутрь масива, чьи&amp;nbsp;ключи названы после типа ассоциации, которую вы&amp;nbsp;пытаетесь создать:&lt;br />
Пожалуйста заметьте что&amp;nbsp;в&amp;nbsp;ваших таблицах должны быть коректно прописаны ключи (или ассоциативные масивы соответственно настроеные) чтобы связывать модели на&amp;nbsp;лету.&lt;/div>&lt;/div>
</description>
</item>
<item>
<title>2008-04-09 13:24:02</title>
<link>http://cake-php.ru/wiki/Manual11/Models/show?time=2008-04-09+13%3A24%3A02</link>
<description>&lt;div class="pageBefore">&lt;img src="http://cake-php.ru/wiki/images/z.gif" width="1" height="1" border="0" alt="" style="display:block" align="top" />&lt;/div>&lt;div class="page">
&lt;b>Сравнение версий &lt;a  href="http://cake-php.ru/wiki/Manual11/Models" class="">/Manual&amp;nbsp;11&amp;nbsp;/&amp;nbsp;Models&lt;/a> за &lt;a href="http://cake-php.ru/wiki/Manual11/Models?time=2008-04-09+13%3A24%3A02">2008-04-09 13:24:02&lt;/a> и &lt;a href="http://cake-php.ru/wiki/Manual11/Models?time=2008-04-09+13%3A52%3A38">2008-04-09 13:52:38&lt;/a>&lt;/b>&lt;br />
&lt;br />
&lt;b>Добавлено:&lt;/b>&lt;br />
&lt;div class="additions">Теперь, когда вы&amp;nbsp;освоили простейшие ассоциации, давайте перейдем к&amp;nbsp;последнему типу ассоциаций hasAndBelongsToMany (или HABTM). Эта&amp;nbsp;последняя ассоциация &amp;ndash; самая сложная, но&amp;nbsp;также и&amp;nbsp;одна из&amp;nbsp;самых полезных. Ассоциация НАВТМ полезна, когда у&amp;nbsp;вас есть две&amp;nbsp;модели, которые связаны между собой связной таблицей. Связная таблица содержит индивидуальные строки, которые относятся друг к&amp;nbsp;другу.&lt;br />
Для&amp;nbsp;этого там&amp;nbsp;нужно установить корректные таблицы для&amp;nbsp;этой ассоциации. Конечно, нам&amp;nbsp;понадобится таблица &amp;#147;tags&amp;#148; для&amp;nbsp;модели Tag, и&amp;nbsp;таблица &amp;#147;posts&amp;#148; для&amp;nbsp;постов, но&amp;nbsp;также нам&amp;nbsp;будет нужна связная таблица для&amp;nbsp;этой ассоциации. Схема присвоения имен для&amp;nbsp;связных таблиц НАВТМ это&amp;nbsp;[имя первой модели во&amp;nbsp;множественном числе]_[имя второй модели во&amp;nbsp;множественном числе], где&amp;nbsp;имена моделей должны идти в&amp;nbsp;алфавитном порядке:&lt;/div>&lt;br />
&lt;b>Удалено:&lt;/b>&lt;br />
&lt;div class="deletions">Теперь когда вы&amp;nbsp;освоили простейшие ассоциации, давайте перейдем к&amp;nbsp;последнему типу ассоциаций hasAndBelongsToMany (или HABTM). Эта&amp;nbsp;последняя ассоциация &amp;ndash; самая сложная, но&amp;nbsp;также и&amp;nbsp;одна из&amp;nbsp;самых полезных. Ассоциация НАВТМ полезна когда у&amp;nbsp;вас есть две&amp;nbsp;модели, которые связаны между собой связной таблицей. Связная таблица содержит индивидуальные строки, которые относятся друг к&amp;nbsp;другу.&lt;br />
Для&amp;nbsp;этого там&amp;nbsp;нужно установить коректные таблицы для&amp;nbsp;это ассоциации. Конечно нам&amp;nbsp;понадобится таблица &amp;#147;tags&amp;#148; для&amp;nbsp;модели Tag, и&amp;nbsp;таблица &amp;#147;posts&amp;#148; для&amp;nbsp;постов, но&amp;nbsp;также нам&amp;nbsp;будет нужна связная таблица для&amp;nbsp;этой ассоциации. Схема присвоения имен для&amp;nbsp;связных таблиц НАВТМ это&amp;nbsp;[имя первой модели во&amp;nbsp;множественном числе]_[имя второй модели во&amp;nbsp;множественном числе], где&amp;nbsp;имена моделей должны идти в&amp;nbsp;алфавитном порядке:&lt;/div>&lt;/div>
</description>
</item>
<item>
<title>2008-04-02 18:39:23</title>
<link>http://cake-php.ru/wiki/Manual11/Models/show?time=2008-04-02+18%3A39%3A23</link>
<description>&lt;div class="pageBefore">&lt;img src="http://cake-php.ru/wiki/images/z.gif" width="1" height="1" border="0" alt="" style="display:block" align="top" />&lt;/div>&lt;div class="page">
&lt;b>Сравнение версий &lt;a  href="http://cake-php.ru/wiki/Manual11/Models" class="">/Manual&amp;nbsp;11&amp;nbsp;/&amp;nbsp;Models&lt;/a> за &lt;a href="http://cake-php.ru/wiki/Manual11/Models?time=2008-04-02+18%3A39%3A23">2008-04-02 18:39:23&lt;/a> и &lt;a href="http://cake-php.ru/wiki/Manual11/Models?time=2008-04-09+13%3A24%3A02">2008-04-09 13:24:02&lt;/a>&lt;/b>&lt;br />
&lt;br />
&lt;b>Добавлено:&lt;/b>&lt;br />
&lt;div class="additions">Теперь когда вы&amp;nbsp;освоили простейшие ассоциации, давайте перейдем к&amp;nbsp;последнему типу ассоциаций hasAndBelongsToMany (или HABTM). Эта&amp;nbsp;последняя ассоциация &amp;ndash; самая сложная, но&amp;nbsp;также и&amp;nbsp;одна из&amp;nbsp;самых полезных. Ассоциация НАВТМ полезна когда у&amp;nbsp;вас есть две&amp;nbsp;модели, которые связаны между собой связной таблицей. Связная таблица содержит индивидуальные строки, которые относятся друг к&amp;nbsp;другу.&lt;/div>&lt;br />
&lt;b>Удалено:&lt;/b>&lt;br />
&lt;div class="deletions">Тперь когда вы&amp;nbsp;освоили простейшие ассоциации, давайте перейдем к&amp;nbsp;последнему типу ассоциаций hasAndBelongsToMany (или HABTM). Эта&amp;nbsp;последняя ассоциация &amp;ndash; самая сложная, но&amp;nbsp;также и&amp;nbsp;одна из&amp;nbsp;самых полезных. Ассоциация НАВТМ полезна когда у&amp;nbsp;вас есть две&amp;nbsp;модели, которые связаны между собой связной таблицей. Связная таблица содержит индивидуальные строки, которые относятся друг к&amp;nbsp;другу.&lt;/div>&lt;/div>
</description>
</item>
<item>
<title>2008-04-02 18:37:29</title>
<link>http://cake-php.ru/wiki/Manual11/Models/show?time=2008-04-02+18%3A37%3A29</link>
<description>&lt;div class="pageBefore">&lt;img src="http://cake-php.ru/wiki/images/z.gif" width="1" height="1" border="0" alt="" style="display:block" align="top" />&lt;/div>&lt;div class="page">
&lt;b>Сравнение версий &lt;a  href="http://cake-php.ru/wiki/Manual11/Models" class="">/Manual&amp;nbsp;11&amp;nbsp;/&amp;nbsp;Models&lt;/a> за &lt;a href="http://cake-php.ru/wiki/Manual11/Models?time=2008-04-02+18%3A37%3A29">2008-04-02 18:37:29&lt;/a> и &lt;a href="http://cake-php.ru/wiki/Manual11/Models?time=2008-04-02+18%3A39%3A23">2008-04-02 18:39:23&lt;/a>&lt;/b>&lt;br />
&lt;br />
&lt;b>Добавлено:&lt;/b>&lt;br />
&lt;div class="additions">beforeFind() колбек вызывается сразу перед началом операции поиска. Поместить любой передующий поиску код&amp;nbsp;сюда. Когда вы&amp;nbsp;перепишете это&amp;nbsp;в&amp;nbsp;свою модель, верните значение true, когда захотите чтобы начался поиск, или&amp;nbsp;false, когда захотите отменить его.&lt;br />
// Дата/время поля созданы HTML-хелпером:&lt;br />
// Функция колбека модели, используемая для&amp;nbsp;того, чтобы сшить&lt;br />
// данные о&amp;nbsp;дате в&amp;nbsp;месте для&amp;nbsp;сохранения.&lt;/div>&lt;br />
&lt;b>Удалено:&lt;/b>&lt;br />
&lt;div class="deletions">beforeFind() колбек вызывается сразу перед началом операции поиска. Поместить любой передующий поиску код&amp;nbsp;сюда. Когда вы&amp;nbsp;перепишете это&amp;nbsp;в&amp;nbsp;свою модель, верните значение true когда захотите чтобы начался поиск, илиfalse когда захотите отменить его.&lt;br />
// Дата/время поля созданы HTML Хелпером:&lt;br />
// Функция колбека модели используемая для&amp;nbsp;того чтобы сшить&lt;br />
// данные о&amp;nbsp;дате вместе для&amp;nbsp;сохранения&lt;/div>&lt;/div>
</description>
</item>
<item>
<title>2008-04-02 13:29:42</title>
<link>http://cake-php.ru/wiki/Manual11/Models/show?time=2008-04-02+13%3A29%3A42</link>
<description>&lt;div class="pageBefore">&lt;img src="http://cake-php.ru/wiki/images/z.gif" width="1" height="1" border="0" alt="" style="display:block" align="top" />&lt;/div>&lt;div class="page">
&lt;b>Сравнение версий &lt;a  href="http://cake-php.ru/wiki/Manual11/Models" class="">/Manual&amp;nbsp;11&amp;nbsp;/&amp;nbsp;Models&lt;/a> за &lt;a href="http://cake-php.ru/wiki/Manual11/Models?time=2008-04-02+13%3A29%3A42">2008-04-02 13:29:42&lt;/a> и &lt;a href="http://cake-php.ru/wiki/Manual11/Models?time=2008-04-02+18%3A37%3A29">2008-04-02 18:37:29&lt;/a>&lt;/b>&lt;br />
&lt;br />
&lt;b>Добавлено:&lt;/b>&lt;br />
&lt;div class="additions">Используйте этот колбек, чтобы модифицировать результаты, которые вернулись после операции поиска, или&amp;nbsp;впишите любой другой после-поисковый код. Параметры для&amp;nbsp;этой функции &amp;ndash; вернувшиеся результаты из&amp;nbsp;операции поиска модели, а&amp;nbsp;вернувшееся значение &amp;ndash; это&amp;nbsp;модифицированные результаты.&lt;/div>&lt;br />
&lt;b>Удалено:&lt;/b>&lt;br />
&lt;div class="deletions">Используйте этот колбек, чтобы модифицировать результаты, которые вернулись после операции поиска, или&amp;nbsp;впишите любой другой после-поисковый код. Параметры для&amp;nbsp;этой функции &amp;ndash; вернувшиеся рузльтаты из&amp;nbsp;операции поиска модели, а&amp;nbsp;вернувшееся значение &amp;ndash; это&amp;nbsp;модифицированные результаты.&lt;/div>&lt;/div>
</description>
</item>
<item>
<title>2008-04-02 13:23:33</title>
<link>http://cake-php.ru/wiki/Manual11/Models/show?time=2008-04-02+13%3A23%3A33</link>
<description>&lt;div class="pageBefore">&lt;img src="http://cake-php.ru/wiki/images/z.gif" width="1" height="1" border="0" alt="" style="display:block" align="top" />&lt;/div>&lt;div class="page">
&lt;b>Сравнение версий &lt;a  href="http://cake-php.ru/wiki/Manual11/Models" class="">/Manual&amp;nbsp;11&amp;nbsp;/&amp;nbsp;Models&lt;/a> за &lt;a href="http://cake-php.ru/wiki/Manual11/Models?time=2008-04-02+13%3A23%3A33">2008-04-02 13:23:33&lt;/a> и &lt;a href="http://cake-php.ru/wiki/Manual11/Models?time=2008-04-02+13%3A29%3A42">2008-04-02 13:29:42&lt;/a>&lt;/b>&lt;br />
&lt;br />
&lt;b>Добавлено:&lt;/b>&lt;br />
&lt;div class="additions">&lt;ol type="8">&lt;li> finderQuery: установите полное SQL-выражение для&amp;nbsp;добавления в&amp;nbsp;выборку ассоциации. Это&amp;nbsp;отличный способ для&amp;nbsp;сложных ассоциаций, которые зависят от&amp;nbsp;нескольких таблиц. Если автоматические ассоциации Cake не&amp;nbsp;работают, вот&amp;nbsp;где вы&amp;nbsp;можете их&amp;nbsp;настроить.
&lt;/li>&lt;li> finderQuery: установите полное выражение SQL&amp;nbsp;для добавления в&amp;nbsp;выборку ассоциации. Это&amp;nbsp;отличный способ для&amp;nbsp;сложных ассоциаций, которые зависят от&amp;nbsp;нескольких таблиц. Если автоматические ассоциации Cake не&amp;nbsp;работают, вот&amp;nbsp;где вы&amp;nbsp;можете их&amp;nbsp;настроить.&lt;/li>&lt;/ol>&lt;/div>&lt;br />
&lt;b>Удалено:&lt;/b>&lt;br />
&lt;div class="deletions">&lt;ol type="8">&lt;li> finderQuery: установите полное SQL-выражение для&amp;nbsp;добавления в&amp;nbsp;выборку ассоциации. Это&amp;nbsp;отличный способ для&amp;nbsp;сложных ассоциаций, которые зависят от&amp;nbsp;нескольких таблиц. Если атоматические ассоциации Cake не&amp;nbsp;работают, вот&amp;nbsp;где вы&amp;nbsp;можете их&amp;nbsp;настроить.
&lt;/li>&lt;li> finderQuery: установите полное выражение SQL&amp;nbsp;для добавления в&amp;nbsp;выборку ассоциации. Это&amp;nbsp;отличный способ для&amp;nbsp;сложных ассоциаций, которые зависят от&amp;nbsp;нескольких таблиц. Если атоматические ассоциации Cake не&amp;nbsp;работают, вот&amp;nbsp;где вы&amp;nbsp;можете их&amp;nbsp;настроить.&lt;/li>&lt;/ol>&lt;/div>&lt;/div>
</description>
</item>
<item>
<title>2008-03-31 18:22:47</title>
<link>http://cake-php.ru/wiki/Manual11/Models/show?time=2008-03-31+18%3A22%3A47</link>
<description>&lt;div class="pageBefore">&lt;img src="http://cake-php.ru/wiki/images/z.gif" width="1" height="1" border="0" alt="" style="display:block" align="top" />&lt;/div>&lt;div class="page">
&lt;b>Сравнение версий &lt;a  href="http://cake-php.ru/wiki/Manual11/Models" class="">/Manual&amp;nbsp;11&amp;nbsp;/&amp;nbsp;Models&lt;/a> за &lt;a href="http://cake-php.ru/wiki/Manual11/Models?time=2008-03-31+18%3A22%3A47">2008-03-31 18:22:47&lt;/a> и &lt;a href="http://cake-php.ru/wiki/Manual11/Models?time=2008-04-02+13%3A23%3A33">2008-04-02 13:23:33&lt;/a>&lt;/b>&lt;br />
&lt;br />
&lt;b>Добавлено:&lt;/b>&lt;br />
&lt;div class="additions">&lt;ol type="2">&lt;li> conditions: фрагменты условий SQL, которые объявляют отношения. Мы&amp;nbsp;можем использовать это&amp;nbsp;для того, чтобы сообщить Cake'у, что&amp;nbsp;нужно ассоциировать только комментарии, которые могут быть модерированы. Это&amp;nbsp;можно сделать присвоением ключу значения "&lt;span class="missingpage">Comment.moderated&lt;/span>&lt;a href="http://cake-php.ru/wiki/Comment/moderated/edit?add=1" title="Создать эту страницу">?&lt;/a> = 1&amp;quot;, или&amp;nbsp;что-то схожее.&lt;/li>&lt;/ol>&lt;/div>&lt;br />
&lt;b>Удалено:&lt;/b>&lt;br />
&lt;div class="deletions">&lt;ol type="2">&lt;li> conditions: фрагменты услвоий SQL, которые объявляют отношения. Мы&amp;nbsp;можем использовать это&amp;nbsp;для того, чтобы сообщить Cake'у, что&amp;nbsp;нужно ассоциировать только комментарии, которые могут быть модерированы. Это&amp;nbsp;можно сделать присвоением ключу значения "&lt;span class="missingpage">Comment.moderated&lt;/span>&lt;a href="http://cake-php.ru/wiki/Comment/moderated/edit?add=1" title="Создать эту страницу">?&lt;/a> = 1&amp;quot;, или&amp;nbsp;что-то схожее.&lt;/li>&lt;/ol>&lt;/div>&lt;/div>
</description>
</item>
<item>
<title>2008-03-31 17:36:21</title>
<link>http://cake-php.ru/wiki/Manual11/Models/show?time=2008-03-31+17%3A36%3A21</link>
<description>&lt;div class="pageBefore">&lt;img src="http://cake-php.ru/wiki/images/z.gif" width="1" height="1" border="0" alt="" style="display:block" align="top" />&lt;/div>&lt;div class="page">
&lt;b>Сравнение версий &lt;a  href="http://cake-php.ru/wiki/Manual11/Models" class="">/Manual&amp;nbsp;11&amp;nbsp;/&amp;nbsp;Models&lt;/a> за &lt;a href="http://cake-php.ru/wiki/Manual11/Models?time=2008-03-31+17%3A36%3A21">2008-03-31 17:36:21&lt;/a> и &lt;a href="http://cake-php.ru/wiki/Manual11/Models?time=2008-03-31+18%3A22%3A47">2008-03-31 18:22:47&lt;/a>&lt;/b>&lt;br />
&lt;br />
&lt;b>Добавлено:&lt;/b>&lt;br />
&lt;div class="additions">Чтобы установить эту&amp;nbsp;ассоциацию, мы&amp;nbsp;предполагаем что&amp;nbsp;вы&amp;nbsp;уже создали модели User и&amp;nbsp;Profile. Чтобы объявить hasOne-ассоциацию между ними, нам&amp;nbsp;понадобится добавить масив к&amp;nbsp;модели, чтобы сообщить Cake'у как&amp;nbsp;они будут относится. Вот&amp;nbsp;как это&amp;nbsp;выглядит:&lt;br />
//Вот как&amp;nbsp;будет выглядеть ссылка, если мы&amp;nbsp;используем ее&amp;nbsp;для передачи параметра...&lt;/div>&lt;br />
&lt;b>Удалено:&lt;/b>&lt;br />
&lt;div class="deletions">Что&amp;nbsp;бы&amp;nbsp;установить эту&amp;nbsp;ассоциацию, мы&amp;nbsp;предполагаем что&amp;nbsp;вы&amp;nbsp;уже создали модели User и&amp;nbsp;Profile. Чтобы объявить hasOne-ассоциацию между ними, нам&amp;nbsp;понадобится добавить масив к&amp;nbsp;модели, чтобы сообщить Cake'у как&amp;nbsp;они будут относится. Вот&amp;nbsp;как это&amp;nbsp;выглядит:&lt;br />
//Вот как&amp;nbsp;будет выглядеть ссылка если мы&amp;nbsp;используем ее&amp;nbsp;для передачи параметра...&lt;/div>&lt;/div>
</description>
</item>
<item>
<title>2007-10-21 03:20:02</title>
<link>http://cake-php.ru/wiki/Manual11/Models/show?time=2007-10-21+03%3A20%3A02</link>
<description>&lt;div class="pageBefore">&lt;img src="http://cake-php.ru/wiki/images/z.gif" width="1" height="1" border="0" alt="" style="display:block" align="top" />&lt;/div>&lt;div class="page">
&lt;b>Сравнение версий &lt;a  href="http://cake-php.ru/wiki/Manual11/Models" class="">/Manual&amp;nbsp;11&amp;nbsp;/&amp;nbsp;Models&lt;/a> за &lt;a href="http://cake-php.ru/wiki/Manual11/Models?time=2007-10-21+03%3A20%3A02">2007-10-21 03:20:02&lt;/a> и &lt;a href="http://cake-php.ru/wiki/Manual11/Models?time=2008-03-31+17%3A36%3A21">2008-03-31 17:36:21&lt;/a>&lt;/b>&lt;br />
&lt;br />
&lt;b>Добавлено:&lt;/b>&lt;br />
&lt;div class="additions">Чтобы показать как&amp;nbsp;некоторые из&amp;nbsp;этих ассоциаций работают, давайте продолжим использовать приложение блога как&amp;nbsp;пример. Представьте, что&amp;nbsp;мы&amp;nbsp;собираемся создать простую систему управления пользователями блога. Я&amp;nbsp;предполагаю это&amp;nbsp;будет не&amp;nbsp;для того, чтобы следить за&amp;nbsp;пользователями, а&amp;nbsp;для того чтобы у&amp;nbsp;каждого пользователя был&amp;nbsp;ассоциированный профиль (Profile, пользователь hasOne профиль). Пользователи также смогут создавать комментарии оставляя ассоциацию с&amp;nbsp;ними (пользователь hasMany комментарии). Сделав пользовательскую систему, мы&amp;nbsp;переходим к&amp;nbsp;тому, чтобы позволить постам относится к&amp;nbsp;тег-объектам, используя тип&amp;nbsp;ассоциаций hasAndBelongsToMany (имеетИПринадлежитМногим, то&amp;nbsp;есть пост имеет и&amp;nbsp;принадлежит многим тегам).&lt;br />
Теперь User и&amp;nbsp;Profile модели ассоциированы и&amp;nbsp;работают как&amp;nbsp;надо, давайте создадим систему, в&amp;nbsp;которой записи пользователей будут ассоциированы с&amp;nbsp;записями комментариев. Это&amp;nbsp;делается в&amp;nbsp;модели User так:&lt;br />
&lt;ol type="2">&lt;li> conditions: фрагменты услвоий SQL, которые объявляют отношения. Мы&amp;nbsp;можем использовать это&amp;nbsp;для того, чтобы сообщить Cake'у, что&amp;nbsp;нужно ассоциировать только комментарии, которые могут быть модерированы. Это&amp;nbsp;можно сделать присвоением ключу значения "&lt;span class="missingpage">Comment.moderated&lt;/span>&lt;a href="http://cake-php.ru/wiki/Comment/moderated/edit?add=1" title="Создать эту страницу">?&lt;/a> = 1&amp;quot;, или&amp;nbsp;что-то схожее.
&lt;/li>&lt;li> limit: максимальное количество ассоциируемых моделей, которые вы&amp;nbsp;хотите чтобы Cake добавил в&amp;nbsp;выборку. Для&amp;nbsp;этого примеры, мы&amp;nbsp;не хотим отбирать все&amp;nbsp;комментарии пользователя, а&amp;nbsp;всего пять.&lt;/li>&lt;/ol>
Теперь когда мы&amp;nbsp;выполняем запросы find() и&amp;nbsp;findAll(), используя модель User, мы&amp;nbsp;должны увидить все&amp;nbsp;ассоциированные комментарии:&lt;br />
Разница между hasMany и&amp;nbsp;hasAndBelongsToMany в&amp;nbsp;том, что&amp;nbsp;с&amp;nbsp;hasMany ассоциированная модель не&amp;nbsp;общая. Если User hasMany Comments, это&amp;nbsp;*только* пользователь ассоциирован с&amp;nbsp;теми комментариями. С&amp;nbsp;НАВТМ, ассоциированная модель &amp;ndash; общая. Это&amp;nbsp;хорошо для&amp;nbsp;того, что&amp;nbsp;мы&amp;nbsp;будем делать дальше: ассоциировать модель Post с&amp;nbsp;моделью Tag. Пока модель Tag&amp;nbsp;принадлежит модели Post, мы&amp;nbsp;не хотим чтобы она&amp;nbsp;была 'истощена', мы&amp;nbsp;хотим продолжить, ассоциировать ее&amp;nbsp;с другими постами.&lt;br />
Важно запомнить одну вещь при&amp;nbsp;работе с&amp;nbsp;ассоциативными моделями. Это&amp;nbsp;то, что&amp;nbsp;сохранение данных должно происходить через соответствующую модель Cake. Если сохраняете новый пост и&amp;nbsp;ассоциированные с&amp;nbsp;ним комментарии, тогда вам&amp;nbsp;нужно использовать обе&amp;nbsp;модели Post и&amp;nbsp;Comment во&amp;nbsp;время операции сохранения.&lt;br />
Если ни&amp;nbsp;одна из&amp;nbsp;ассоциированных моделей в&amp;nbsp;системе еще&amp;nbsp;не&amp;nbsp;существует (например, вы&amp;nbsp;хотите сохранить новый пост и&amp;nbsp;соответствующий комментарий одновременно), вам&amp;nbsp;нужно сначала сохранить главную, родительскую модель. Чтобы понять как&amp;nbsp;это работает, давайте представим, что&amp;nbsp;у&amp;nbsp;нас есть действие в&amp;nbsp;нашем &lt;span class="missingpage">Post&amp;nbsp;Controller&lt;/span>&lt;a href="http://cake-php.ru/wiki/PostController/edit?add=1" title="Создать эту страницу">?&lt;/a> которое управляет сохранением новых постов и&amp;nbsp;соответствующих комментариев. Пример ниже подразумевает, что&amp;nbsp;вы&amp;nbsp;воздали один пост и&amp;nbsp;один комментарий.&lt;br />
&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">//Теперь нам&amp;nbsp;нужно сохранить данные комментария&lt;br />
//и сохраняем комментарий.&lt;br />
//к модели комментария через модель Post:&lt;/div>&lt;/div>&lt;/div>&lt;/div>
Если, все&amp;nbsp;же, родительская модель уже&amp;nbsp;существует в&amp;nbsp;системе (например, добавление комментария к&amp;nbsp;существующему посту), нам&amp;nbsp;нужно знать ID&amp;nbsp;родительской модели перед сохранением. Мы&amp;nbsp;можем поместить этот ID&amp;nbsp;в ссылку или&amp;nbsp;как скрытый элемент в&amp;nbsp;форме...&lt;/div>&lt;br />
&lt;b>Удалено:&lt;/b>&lt;br />
&lt;div class="deletions">Чтобы показать как&amp;nbsp;некоторые из&amp;nbsp;этих ассоциаций работают, давайте продолжим использовать приложение блога как&amp;nbsp;пример. Представьте, что&amp;nbsp;мы&amp;nbsp;собираемся создать простую систему управления пользователями блога. Я&amp;nbsp;предполагаю это&amp;nbsp;будет не&amp;nbsp;для того, чтобы следить за&amp;nbsp;пользователями, а&amp;nbsp;для того чтобы у&amp;nbsp;каждого пользователя был&amp;nbsp;ассоциированный профиль (Profile, пользователь hasOne профиль). Пользователи также смогут создавать коментарии оставляя ассоциацию с&amp;nbsp;ними (пользователь hasMany коментарии). Сделав пользовательскую систему, мы&amp;nbsp;переходим к&amp;nbsp;тому, чтобы позволить постам относится к&amp;nbsp;тег-объектам, используя тип&amp;nbsp;ассоциаций hasAndBelongsToMany (имеетИПринадлежитМногим, то&amp;nbsp;есть пост имеет и&amp;nbsp;принадлежит многим тегам).&lt;br />
Теперь User и&amp;nbsp;Profile модели ассоциированы и&amp;nbsp;работают как&amp;nbsp;надо, давайте создадим систему, в&amp;nbsp;которой записи пользователей будут ассоциированы с&amp;nbsp;записями коментариев. Это&amp;nbsp;делается в&amp;nbsp;модели User так:&lt;br />
&lt;ol type="2">&lt;li> conditions: фрагменты услвоий SQL, которые объявляют отношения. Мы&amp;nbsp;можем использовать это&amp;nbsp;для того, чтобы сообщить Cake'у, что&amp;nbsp;нужно ассоциировать только коментарии, которые могут быть модерированы. Это&amp;nbsp;можно сделать присвоением ключу значения "&lt;span class="missingpage">Comment.moderated&lt;/span>&lt;a href="http://cake-php.ru/wiki/Comment/moderated/edit?add=1" title="Создать эту страницу">?&lt;/a> = 1&amp;quot;, или&amp;nbsp;что-то схожее.
&lt;/li>&lt;li> limit: максимальное количество ассоциируемых моделей, которые вы&amp;nbsp;хотите чтобы Cake добавил в&amp;nbsp;выборку. Для&amp;nbsp;этого примеры, мы&amp;nbsp;не хотим отбирать все&amp;nbsp;коментарии пользователя, а&amp;nbsp;всего пять.&lt;/li>&lt;/ol>
Теперь когда мы&amp;nbsp;выполняем запросы find() и&amp;nbsp;findAll(), используя модель User, мы&amp;nbsp;должны увидить все&amp;nbsp;ассоциированные коментарии:&lt;br />
Разница между hasMany и&amp;nbsp;hasAndBelongsToMany в&amp;nbsp;том, что&amp;nbsp;с&amp;nbsp;hasMany ассоциированная модель не&amp;nbsp;общая. Если User hasMany Comments, это&amp;nbsp;*только* пользователь ассоциирован с&amp;nbsp;теми коментариями. С&amp;nbsp;НАВТМ, ассоциированная модель &amp;ndash; общая. Это&amp;nbsp;хорошо для&amp;nbsp;того, что&amp;nbsp;мы&amp;nbsp;будем делать дальше: ассоциировать модель Post с&amp;nbsp;моделью Tag. Пока модель Tag&amp;nbsp;принадлежит модели Post, мы&amp;nbsp;не хотим чтобы она&amp;nbsp;была 'истощена', мы&amp;nbsp;хотим продолжить, ассоциировать ее&amp;nbsp;с другими постами.&lt;br />
Важно запомнить одну вещь при&amp;nbsp;работе с&amp;nbsp;ассоциативными моделями. Это&amp;nbsp;то, что&amp;nbsp;сохранение данных должно происходить через соответствующую модель Cake. Если сохраняете новый пост и&amp;nbsp;ассоциированные с&amp;nbsp;ним коментарии, тогда вам&amp;nbsp;нужно использовать обе&amp;nbsp;модели Post и&amp;nbsp;Comment во&amp;nbsp;время операции сохранения.&lt;br />
Если ни&amp;nbsp;одна из&amp;nbsp;ассоциированных моделей в&amp;nbsp;системе еще&amp;nbsp;не&amp;nbsp;существует (например, вы&amp;nbsp;хотите сохранить новый пост и&amp;nbsp;соответствующий коментарий одновременно), вам&amp;nbsp;нужно сначала сохранить главную, родительскую модель. Чтобы понять как&amp;nbsp;это работает, давайте представим, что&amp;nbsp;у&amp;nbsp;нас есть действие в&amp;nbsp;нашем &lt;span class="missingpage">Post&amp;nbsp;Controller&lt;/span>&lt;a href="http://cake-php.ru/wiki/PostController/edit?add=1" title="Создать эту страницу">?&lt;/a> которое управляет сохранением новых постов и&amp;nbsp;соответствующих коментариев. Пример ниже подразумевает, что&amp;nbsp;вы&amp;nbsp;воздали один пост и&amp;nbsp;один коментарий.&lt;br />
&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">//Теперь нам&amp;nbsp;нужно сохранить данные коментария&lt;br />
//и сохраняем коментарий.&lt;br />
//к модели коментария через модель Post:&lt;/div>&lt;/div>&lt;/div>&lt;/div>
Если, все&amp;nbsp;же, родительская модель уже&amp;nbsp;существует в&amp;nbsp;системе (например, добавление коментария к&amp;nbsp;существующему посту), нам&amp;nbsp;нужно знать ID&amp;nbsp;родительской модели перед сохранением. Мы&amp;nbsp;можем поместить этот ID&amp;nbsp;в ссылку или&amp;nbsp;как скрытый элемент в&amp;nbsp;форме...&lt;/div>&lt;/div>
</description>
</item>
</channel>
</rss>

