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