<?xml version="1.0" encoding="windows-1251"?>
<rss version="2.0">
<channel>
<title>CakePHP - Manual/Developing/Models/Saving</title>
<link>http://cake-php.ru/wiki/Manual/Developing/Models/Saving</link>
<description>History/revisions of CakePHP/Manual/Developing/Models/Saving</description>
<language>en-us</language>
<item>
<title>2009-02-22 12:56:01</title>
<link>http://cake-php.ru/wiki/Manual/Developing/Models/Saving/show?time=2009-02-22+12%3A56%3A01</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=".manual.developing.models.saving" href="http://cake-php.ru/wiki/Manual/Developing/Models/Saving" class="">/Manual&amp;nbsp;/&amp;nbsp;Developing&amp;nbsp;/&amp;nbsp;Models&amp;nbsp;/&amp;nbsp;Saving&lt;/a> за &lt;a href="http://cake-php.ru/wiki/Manual/Developing/Models/Saving?time=2009-02-22+12%3A56%3A01">2009-02-22 12:56:01&lt;/a> и &lt;a href="http://cake-php.ru/wiki/Manual/Developing/Models/Saving">2009-02-22 12:57:10&lt;/a>&lt;/b>&lt;br />
&lt;br />
&lt;b>Добавлено:&lt;/b>&lt;br />
&lt;div class="additions">Для&amp;nbsp;того, чтобы транзакции корректно работали в&amp;nbsp;&lt;span class="missingpage">My&amp;nbsp;SQL&lt;/span>&lt;a href="http://cake-php.ru/wiki/MySQL/edit?add=1" title="Создать эту страницу">?&lt;/a>, &lt;br />
ваши таблицы должны использовать механизм &lt;span class="missingpage">Inno&amp;nbsp;DB&lt;/span>&lt;a href="http://cake-php.ru/wiki/InnoDB/edit?add=1" title="Создать эту страницу">?&lt;/a>. &lt;br />
Если ассоциация между моделями &amp;ndash; hasOne, то&amp;nbsp;вы должны использовать &lt;br />
нотацию &lt;span class="missingpage">Model&amp;nbsp;Name.field&amp;nbsp;Name&lt;/span>&lt;a href="http://cake-php.ru/wiki/ModelName/fieldName/edit?add=1" title="Создать эту страницу">?&lt;/a> для&amp;nbsp;этих моделей.&lt;/div>&lt;br />
&lt;b>Удалено:&lt;/b>&lt;br />
&lt;div class="deletions">Для&amp;nbsp;того, чтобы транзакции корректно работали в&amp;nbsp;&lt;span class="missingpage">My&amp;nbsp;SQL&lt;/span>&lt;a href="http://cake-php.ru/wiki/MySQL/edit?add=1" title="Создать эту страницу">?&lt;/a>, ваши таблицы должны использовать механизм &lt;span class="missingpage">Inno&amp;nbsp;DB&lt;/span>&lt;a href="http://cake-php.ru/wiki/InnoDB/edit?add=1" title="Создать эту страницу">?&lt;/a>. &lt;br />
Если ассоциация между моделями &amp;ndash; hasOne, то&amp;nbsp;вы должны использовать нотацию &lt;span class="missingpage">Model&amp;nbsp;Name.field&amp;nbsp;Name&lt;/span>&lt;a href="http://cake-php.ru/wiki/ModelName/fieldName/edit?add=1" title="Создать эту страницу">?&lt;/a> для&amp;nbsp;этих моделей.&lt;/div>&lt;/div>
</description>
</item>
<item>
<title>2009-02-22 12:54:02</title>
<link>http://cake-php.ru/wiki/Manual/Developing/Models/Saving/show?time=2009-02-22+12%3A54%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/Manual/Developing/Models/Saving" class="">/Manual&amp;nbsp;/&amp;nbsp;Developing&amp;nbsp;/&amp;nbsp;Models&amp;nbsp;/&amp;nbsp;Saving&lt;/a> за &lt;a href="http://cake-php.ru/wiki/Manual/Developing/Models/Saving?time=2009-02-22+12%3A54%3A02">2009-02-22 12:54:02&lt;/a> и &lt;a href="http://cake-php.ru/wiki/Manual/Developing/Models/Saving?time=2009-02-22+12%3A56%3A01">2009-02-22 12:56:01&lt;/a>&lt;/b>&lt;br />
&lt;br />
&lt;b>Добавлено:&lt;/b>&lt;br />
&lt;div class="additions">В&amp;nbsp;этом примере вы&amp;nbsp;можете увидеть скрытое поле &lt;!--notypo-->Recipe.id&lt;!--/notypo-->, значение которого равно 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;можете увидеть скрытое поле &lt;span class="missingpage">Recipe.id&lt;/span>&lt;a href="http://cake-php.ru/wiki/Recipe/id/edit?add=1" title="Создать эту страницу">?&lt;/a>, значение которого равно ID&amp;nbsp;рецепта, с&amp;nbsp;которым мы&amp;nbsp;хотим связать тег.&lt;/div>&lt;/div>
</description>
</item>
<item>
<title>2009-02-20 18:59:21</title>
<link>http://cake-php.ru/wiki/Manual/Developing/Models/Saving/show?time=2009-02-20+18%3A59%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/Manual/Developing/Models/Saving" class="">/Manual&amp;nbsp;/&amp;nbsp;Developing&amp;nbsp;/&amp;nbsp;Models&amp;nbsp;/&amp;nbsp;Saving&lt;/a> за &lt;a href="http://cake-php.ru/wiki/Manual/Developing/Models/Saving?time=2009-02-20+18%3A59%3A21">2009-02-20 18:59:21&lt;/a> и &lt;a href="http://cake-php.ru/wiki/Manual/Developing/Models/Saving?time=2009-02-22+12%3A54%3A02">2009-02-22 12:54:02&lt;/a>&lt;/b>&lt;br />
&lt;br />
&lt;b>Добавлено:&lt;/b>&lt;br />
&lt;div class="additions">&lt;hr noshade="noshade" size="1" />
Эта&amp;nbsp;функция помогает вам&amp;nbsp;кэшировать count связанных данных. Вместо подсчета количества записей вручную с&amp;nbsp;помощью find('count'), модель сама отслеживает все&amp;nbsp;вставки/удаления в&amp;nbsp;ассоциированной через $hasMany модели и&amp;nbsp;увеличивает/уменьшает значение специально выделенного поля типа integer.&lt;br />
Название поля состоит из&amp;nbsp;имени модели в&amp;nbsp;единственном числе, символа подчеркивания и&amp;nbsp;слова &amp;#147;count&amp;#148;.&lt;br />
Допустим, у&amp;nbsp;вас есть модель &lt;!--notypo-->ImageAlbum&lt;!--/notypo--> и&amp;nbsp;модель Image, тогда вам&amp;nbsp;надо добавить INT-поле в&amp;nbsp;таблицу &amp;#147;image_album&amp;#148; и&amp;nbsp;назвать его&amp;nbsp;&amp;#147;image_count&amp;#148;. Или, если ваши имена более сложные, тогда &amp;ndash; другой пример: модели &lt;!--notypo-->BlogEntry&lt;!--/notypo--> и&amp;nbsp;&lt;!--notypo-->BlogEntryComment&lt;!--/notypo-->, имя&amp;nbsp;поля будет &amp;#147;blog_entry_comment_count&amp;#148; и&amp;nbsp;должно быть добавлено в&amp;nbsp;таблицу &amp;#147;blog_entries&amp;#148;.&lt;br />
После того, как&amp;nbsp;вы&amp;nbsp;добавили поле для&amp;nbsp;подсчета записей, вы&amp;nbsp;можете активировать эту&amp;nbsp;функциональность, добавив индекс &amp;#147;counterCache&amp;#148; в&amp;nbsp;ассоциативный массив "$belongsTo&amp;#148;, и&amp;nbsp;присвоив ему&amp;nbsp;значение &amp;#147;true&amp;#148;.&lt;br />
class &lt;span class="missingpage">Image&amp;nbsp;Album&lt;/span>&lt;a href="http://cake-php.ru/wiki/ImageAlbum/edit?add=1" title="Создать эту страницу">?&lt;/a> extends &lt;span class="missingpage">App&amp;nbsp;Model&lt;/span>&lt;a href="http://cake-php.ru/wiki/AppModel/edit?add=1" title="Создать эту страницу">?&lt;/a> {&lt;br />
&lt;div class="indent">&lt;div class="indent">var $hasMany = array(&lt;br />
&lt;div class="indent">&lt;div class="indent">'Image'&lt;br />
&lt;/div>&lt;/div>);&lt;/div>&lt;/div>
class Image extends &lt;span class="missingpage">App&amp;nbsp;Model&lt;/span>&lt;a href="http://cake-php.ru/wiki/AppModel/edit?add=1" title="Создать эту страницу">?&lt;/a> {&lt;br />
&lt;div class="indent">&lt;div class="indent">var $belongsTo = array(&lt;br />
&lt;div class="indent">&lt;div class="indent">'ImageAlbum' =&amp;gt; array('counterCache' =&amp;gt; true)&lt;br />
&lt;/div>&lt;/div>);&lt;/div>&lt;/div>
Теперь каждый раз, когда вы&amp;nbsp;будете добавлять новое изображение &lt;!--notypo-->Image&lt;!--/notypo--> в&amp;nbsp;&lt;!--notypo-->ImageAlbum&lt;!--/notypo--> число &amp;#147;image_count&amp;#148; будет увеличиваться (или уменьшаться, если вы&amp;nbsp;делаете удаление).&lt;br />
&lt;hr noshade="noshade" size="1" />&lt;a name="h814-1">&lt;/a>&lt;h3> Сохранение данных ассоциированных моделей (HABTM)&lt;/h3>
Сохранить модели, которые ассоциированы с&amp;nbsp;помощью hasOne, belongsTo, и&amp;nbsp;hasMany довольно просто:  вы&amp;nbsp;просто заполняете значение внешнего ключа значением ID&amp;nbsp;ассоциированной модели и&amp;nbsp;вызываете метод модели save(), и&amp;nbsp;все корректно связывается.&lt;br />
Когда же&amp;nbsp;используете ассоциацию HABTM, то&amp;nbsp;необходимо установить ID&amp;nbsp;ассоциированной модели в&amp;nbsp;массив данных. Мы&amp;nbsp;создадим форму, которая создает новый тег&amp;nbsp;и&amp;nbsp;ассоциирует его&amp;nbsp;с&amp;nbsp;некоторым рецептом..&lt;br />
Самая простая форма может выглядеть так&amp;nbsp;(мы предполагаем, что $recipe_id уже&amp;nbsp;имеет какое-то значение):&lt;br />
&amp;lt;?php echo $form-&amp;gt;create('Tag');?&amp;gt;&lt;br />
&lt;div class="indent">&lt;div class="indent">&amp;lt;?php echo $form-&amp;gt;input(&lt;br />
&lt;div class="indent">&lt;div class="indent">'&lt;span class="missingpage">Recipe.id&lt;/span>&lt;a href="http://cake-php.ru/wiki/Recipe/id/edit?add=1" title="Создать эту страницу">?&lt;/a>', &lt;br />
array('type'=&amp;gt;'hidden', 'value' =&amp;gt; $recipe_id)); ?&amp;gt;&lt;br />
&lt;/div>&lt;/div>&amp;lt;?php echo $form-&amp;gt;input('&lt;span class="missingpage">Tag.name&lt;/span>&lt;a href="http://cake-php.ru/wiki/Tag/name/edit?add=1" title="Создать эту страницу">?&lt;/a>'); ?&amp;gt;&lt;br />
&amp;lt;?php echo $form-&amp;gt;end('Add Tag'); ?&amp;gt;&lt;/div>&lt;/div>
В&amp;nbsp;этом примере вы&amp;nbsp;можете увидеть скрытое поле &lt;span class="missingpage">Recipe.id&lt;/span>&lt;a href="http://cake-php.ru/wiki/Recipe/id/edit?add=1" title="Создать эту страницу">?&lt;/a>, значение которого равно ID&amp;nbsp;рецепта, с&amp;nbsp;которым мы&amp;nbsp;хотим связать тег.&lt;br />
Когда метод save() будет вызван из&amp;nbsp;контроллера, то&amp;nbsp;он автоматически сохранит данные HABTM в&amp;nbsp;базу данных.&lt;br />
&lt;div class="indent">&lt;div class="indent">&lt;br />
//Сохранение ассоциации&lt;br />
if&amp;nbsp;($this-&amp;gt;Tag-&amp;gt;save($this-&amp;gt;data)) {&lt;br />
&lt;div class="indent">&lt;div class="indent">//действия в&amp;nbsp;случае успешного сохранения            &lt;/div>&lt;/div>&lt;/div>&lt;/div>
В&amp;nbsp;предыдущем коде наш&amp;nbsp;новый Tag&amp;nbsp;создан и&amp;nbsp;ассоциирован с&amp;nbsp;рецептом Recipe, ID&amp;nbsp;которого находится в $this-&amp;gt;data['Recipe']['id'].&lt;br />
В&amp;nbsp;других случаях, для&amp;nbsp;отображения наших ассоциированных данных мы&amp;nbsp;можем применить выпадающий список. Данные могут быть извлечены из&amp;nbsp;модели с&amp;nbsp;помощью метода find('list') и&amp;nbsp;переданы в&amp;nbsp;переменную отображения. Input с&amp;nbsp;таким же&amp;nbsp;именем автоматически поместит данные в&amp;nbsp;&amp;lt;select&amp;gt;.&lt;br />
// в&amp;nbsp;контроллере:&lt;br />
$this-&amp;gt;set('tags', $this-&amp;gt;Recipe-&amp;gt;Tag-&amp;gt;find('list'));&lt;br />
// в&amp;nbsp;отображении:&lt;br />
$form-&amp;gt;input('tags');&lt;br />
Более желательный вариант со&amp;nbsp;связью HABTM будет включать &amp;lt;select&amp;gt;, позволяющий делать множественный выбор. Например, рецепт может иметь много тегов. В&amp;nbsp;этом случае данные из&amp;nbsp;модели извлекаются тем&amp;nbsp;же&amp;nbsp;путем, но&amp;nbsp;форма input определяется по&amp;nbsp;другому. Имя&amp;nbsp;тега записывается в&amp;nbsp;виде &lt;!--notypo-->ModelName.ModelName&lt;!--/notypo-->.&lt;br />
// в&amp;nbsp;контроллере:&lt;br />
$this-&amp;gt;set('tags', $this-&amp;gt;Recipe-&amp;gt;Tag-&amp;gt;find('list'));&lt;br />
// в&amp;nbsp;отображении:&lt;br />
$form-&amp;gt;input('&lt;span class="missingpage">Tag.Tag&lt;/span>&lt;a href="http://cake-php.ru/wiki/Tag/Tag/edit?add=1" title="Создать эту страницу">?&lt;/a>');&lt;br />
Используя код&amp;nbsp;выше, можно создать множественные выпадающие списки, значения которых будут автоматически сохранены в&amp;nbsp;модель Recipe, при&amp;nbsp;добавлении или&amp;nbsp;сохранении записей в&amp;nbsp;базу данных.&lt;br />
&lt;span class="missingpage">&amp;lt;&amp;lt; Получение данных&lt;/span>&lt;a href="http://cake-php.ru/wiki/Retrieving/edit?add=1" title="Создать эту страницу">?&lt;/a> | &lt;span class="missingpage">Удаление данных &amp;gt;&amp;gt;&lt;/span>&lt;a href="http://cake-php.ru/wiki/Deleting/edit?add=1" title="Создать эту страницу">?&lt;/a>&lt;/div>&lt;br />
&lt;b>Удалено:&lt;/b>&lt;br />
&lt;div class="deletions">Эта&amp;nbsp;функция помогает вам&amp;nbsp;кэшировать count связанных данных.&lt;/div>&lt;/div>
</description>
</item>
<item>
<title>2009-02-20 18:58:38</title>
<link>http://cake-php.ru/wiki/Manual/Developing/Models/Saving/show?time=2009-02-20+18%3A58%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  href="http://cake-php.ru/wiki/Manual/Developing/Models/Saving" class="">/Manual&amp;nbsp;/&amp;nbsp;Developing&amp;nbsp;/&amp;nbsp;Models&amp;nbsp;/&amp;nbsp;Saving&lt;/a> за &lt;a href="http://cake-php.ru/wiki/Manual/Developing/Models/Saving?time=2009-02-20+18%3A58%3A38">2009-02-20 18:58:38&lt;/a> и &lt;a href="http://cake-php.ru/wiki/Manual/Developing/Models/Saving?time=2009-02-20+18%3A59%3A21">2009-02-20 18:59:21&lt;/a>&lt;/b>&lt;br />
&lt;br />
&lt;b>Добавлено:&lt;/b>&lt;br />
&lt;div class="additions">Для&amp;nbsp;того, чтобы транзакции корректно работали в&amp;nbsp;&lt;span class="missingpage">My&amp;nbsp;SQL&lt;/span>&lt;a href="http://cake-php.ru/wiki/MySQL/edit?add=1" title="Создать эту страницу">?&lt;/a>, ваши таблицы должны использовать механизм &lt;span class="missingpage">Inno&amp;nbsp;DB&lt;/span>&lt;a href="http://cake-php.ru/wiki/InnoDB/edit?add=1" title="Создать эту страницу">?&lt;/a>. &lt;br />
Помните, что&amp;nbsp;&lt;span class="missingpage">My&amp;nbsp;ISAM&lt;/span>&lt;a href="http://cake-php.ru/wiki/MyISAM/edit?add=1" title="Создать эту страницу">?&lt;/a> таблицы не&amp;nbsp;поддерживают транзакции. &lt;br />
Именование полей, приведенное выше, требуется для&amp;nbsp;ассоциаций hasMany. &lt;br />
Если ассоциация между моделями &amp;ndash; hasOne, то&amp;nbsp;вы должны использовать нотацию &lt;span class="missingpage">Model&amp;nbsp;Name.field&amp;nbsp;Name&lt;/span>&lt;a href="http://cake-php.ru/wiki/ModelName/fieldName/edit?add=1" title="Создать эту страницу">?&lt;/a> для&amp;nbsp;этих моделей.&lt;/div>&lt;br />
&lt;b>Удалено:&lt;/b>&lt;br />
&lt;div class="deletions">Для&amp;nbsp;того, чтобы транзакции корректно работали в&amp;nbsp;&lt;span class="missingpage">My&amp;nbsp;SQL&lt;/span>&lt;a href="http://cake-php.ru/wiki/MySQL/edit?add=1" title="Создать эту страницу">?&lt;/a>, ваши таблицы должны использовать механизм &lt;span class="missingpage">Inno&amp;nbsp;DB&lt;/span>&lt;a href="http://cake-php.ru/wiki/InnoDB/edit?add=1" title="Создать эту страницу">?&lt;/a>. Помните, что&amp;nbsp;&lt;span class="missingpage">My&amp;nbsp;ISAM&lt;/span>&lt;a href="http://cake-php.ru/wiki/MyISAM/edit?add=1" title="Создать эту страницу">?&lt;/a> таблицы не&amp;nbsp;поддерживают транзакции. &lt;br />
Именование полей, приведенное выше, требуется для&amp;nbsp;ассоциаций hasMany. Если ассоциация между моделями &amp;ndash; hasOne, то&amp;nbsp;вы должны использовать нотацию &lt;span class="missingpage">Model&amp;nbsp;Name.field&amp;nbsp;Name&lt;/span>&lt;a href="http://cake-php.ru/wiki/ModelName/fieldName/edit?add=1" title="Создать эту страницу">?&lt;/a> для&amp;nbsp;этих моделей.&lt;/div>&lt;/div>
</description>
</item>
<item>
<title>2009-02-20 18:44:01</title>
<link>http://cake-php.ru/wiki/Manual/Developing/Models/Saving/show?time=2009-02-20+18%3A44%3A01</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/Manual/Developing/Models/Saving" class="">/Manual&amp;nbsp;/&amp;nbsp;Developing&amp;nbsp;/&amp;nbsp;Models&amp;nbsp;/&amp;nbsp;Saving&lt;/a> за &lt;a href="http://cake-php.ru/wiki/Manual/Developing/Models/Saving?time=2009-02-20+18%3A44%3A01">2009-02-20 18:44:01&lt;/a> и &lt;a href="http://cake-php.ru/wiki/Manual/Developing/Models/Saving?time=2009-02-20+18%3A58%3A38">2009-02-20 18:58:38&lt;/a>&lt;/b>&lt;br />
&lt;br />
&lt;b>Добавлено:&lt;/b>&lt;br />
&lt;div class="additions">Обратите внимание на&amp;nbsp;способ названия полей формы для&amp;nbsp;модели Account. Если Company &amp;ndash; это&amp;nbsp;наша главная модель, то&amp;nbsp;saveAll() будет ожидать данные связанной модели в&amp;nbsp;особом формате. И&amp;nbsp;Account.0.fieldName &amp;ndash; это&amp;nbsp;то, что&amp;nbsp;нужно. &lt;br />
Именование полей, приведенное выше, требуется для&amp;nbsp;ассоциаций hasMany. Если ассоциация между моделями &amp;ndash; hasOne, то&amp;nbsp;вы должны использовать нотацию &lt;span class="missingpage">Model&amp;nbsp;Name.field&amp;nbsp;Name&lt;/span>&lt;a href="http://cake-php.ru/wiki/ModelName/fieldName/edit?add=1" title="Создать эту страницу">?&lt;/a> для&amp;nbsp;этих моделей.&lt;br />
Теперь в&amp;nbsp;нашем файле companies_controller мы&amp;nbsp;можем создать действие add():&lt;br />
&lt;div class="indent"> if(!empty($this-&amp;gt;data)) {&lt;br />
&lt;div class="indent">&lt;div class="indent">$this-&amp;gt;Company-&amp;gt;saveAll($this-&amp;gt;data, array('validate'=&amp;gt;'first'));&lt;br />
&lt;/div>&lt;/div> }&lt;/div>
%% &lt;br />
Это&amp;nbsp;все. Теперь наши модели Company и&amp;nbsp;Account будут проверены на&amp;nbsp;валидность данных и&amp;nbsp;одновременно сохранены. Опция array('validate'=&amp;gt;'first') гарантирует, что&amp;nbsp;обе модели проверены на&amp;nbsp;валидность перед началом сохранения.&lt;a name="h814-1">&lt;/a>&lt;h3>counterCache &amp;ndash; Кэширование count()&lt;/h3>
Эта&amp;nbsp;функция помогает вам&amp;nbsp;кэшировать count связанных данных.&lt;/div>&lt;/div>
</description>
</item>
<item>
<title>2009-02-20 14:33:51</title>
<link>http://cake-php.ru/wiki/Manual/Developing/Models/Saving/show?time=2009-02-20+14%3A33%3A51</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/Manual/Developing/Models/Saving" class="">/Manual&amp;nbsp;/&amp;nbsp;Developing&amp;nbsp;/&amp;nbsp;Models&amp;nbsp;/&amp;nbsp;Saving&lt;/a> за &lt;a href="http://cake-php.ru/wiki/Manual/Developing/Models/Saving?time=2009-02-20+14%3A33%3A51">2009-02-20 14:33:51&lt;/a> и &lt;a href="http://cake-php.ru/wiki/Manual/Developing/Models/Saving?time=2009-02-20+18%3A44%3A01">2009-02-20 18:44:01&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;включает использование переменной модели $id после save(). В&amp;nbsp;других случаях можно получить ID&amp;nbsp;из скрытого инпута в&amp;nbsp;форме, значение которого передается в&amp;nbsp;действие контроллера.&lt;br />
В&amp;nbsp;дополнение к&amp;nbsp;базовому подходу &lt;!--notypo-->CakePHP&lt;!--/notypo--> также предлагает очень удобный метод saveAll(), который позволяет вам&amp;nbsp;проверить валидность и&amp;nbsp;сохранить множество моделей за&amp;nbsp;раз. Также, saveAll() поддерживает транзакции для&amp;nbsp;обеспечения целостности данных в&amp;nbsp;&lt;br />
вашей БД&amp;nbsp;(например, если одна модель не&amp;nbsp;сохранилась, то&amp;nbsp;другие модели тоже не&amp;nbsp;будут сохраняться.)&lt;br />
Для&amp;nbsp;того, чтобы транзакции корректно работали в&amp;nbsp;&lt;span class="missingpage">My&amp;nbsp;SQL&lt;/span>&lt;a href="http://cake-php.ru/wiki/MySQL/edit?add=1" title="Создать эту страницу">?&lt;/a>, ваши таблицы должны использовать механизм &lt;span class="missingpage">Inno&amp;nbsp;DB&lt;/span>&lt;a href="http://cake-php.ru/wiki/InnoDB/edit?add=1" title="Создать эту страницу">?&lt;/a>. Помните, что&amp;nbsp;&lt;span class="missingpage">My&amp;nbsp;ISAM&lt;/span>&lt;a href="http://cake-php.ru/wiki/MyISAM/edit?add=1" title="Создать эту страницу">?&lt;/a> таблицы не&amp;nbsp;поддерживают транзакции. &lt;br />
Давайте посмотрим, как&amp;nbsp;мы&amp;nbsp;можем использовать saveAll() для&amp;nbsp;сохранения моделей Company и&amp;nbsp;Account одновременно.&lt;br />
Во-первых, вам&amp;nbsp;необходимо создать формы для&amp;nbsp;этих моделей (мы предполагаем, что&amp;nbsp;Company hasMany Account). &lt;br />
echo $form-&amp;gt;create('Company', array('action'=&amp;gt;'add'));&lt;br />
echo $form-&amp;gt;input('&lt;span class="missingpage">Company.name&lt;/span>&lt;a href="http://cake-php.ru/wiki/Company/name/edit?add=1" title="Создать эту страницу">?&lt;/a>', array('label'=&amp;gt;'Имя компании'));&lt;br />
echo $form-&amp;gt;input('&lt;span class="missingpage">Company.description&lt;/span>&lt;a href="http://cake-php.ru/wiki/Company/description/edit?add=1" title="Создать эту страницу">?&lt;/a>');&lt;br />
echo $form-&amp;gt;input('&lt;span class="missingpage">Company.location&lt;/span>&lt;a href="http://cake-php.ru/wiki/Company/location/edit?add=1" title="Создать эту страницу">?&lt;/a>');&lt;br />
echo $form-&amp;gt;input('Account.0.name', array('label'=&amp;gt;'Имя счета'));&lt;br />
echo $form-&amp;gt;input('Account.0.username');&lt;br />
echo $form-&amp;gt;input('Account.0.email');&lt;br />
echo $form-&amp;gt;end('Add');&lt;/div>&lt;/div>
</description>
</item>
<item>
<title>2009-02-20 14:01:53</title>
<link>http://cake-php.ru/wiki/Manual/Developing/Models/Saving/show?time=2009-02-20+14%3A01%3A53</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/Manual/Developing/Models/Saving" class="">/Manual&amp;nbsp;/&amp;nbsp;Developing&amp;nbsp;/&amp;nbsp;Models&amp;nbsp;/&amp;nbsp;Saving&lt;/a> за &lt;a href="http://cake-php.ru/wiki/Manual/Developing/Models/Saving?time=2009-02-20+14%3A01%3A53">2009-02-20 14:01:53&lt;/a> и &lt;a href="http://cake-php.ru/wiki/Manual/Developing/Models/Saving?time=2009-02-20+14%3A33%3A51">2009-02-20 14:33:51&lt;/a>&lt;/b>&lt;br />
&lt;br />
&lt;b>Добавлено:&lt;/b>&lt;br />
&lt;div class="additions">Команда для&amp;nbsp;сохранения этих данных будет выглядеть так:&lt;br />
&amp;lt;? $this-&amp;gt;Article-&amp;gt;saveAll($data); ?&amp;gt;&lt;br />
Для&amp;nbsp;сохранения записи вместе с&amp;nbsp;связанными записями, имеющих hasMany ассоциацию, массив данных должен выглядеть так:&lt;br />
&lt;div class="indent">&lt;div class="indent">[Article] =&amp;gt; Array&lt;br />
&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">[title] =&amp;gt; My&amp;nbsp;first article&lt;br />
&lt;/div>&lt;/div>&lt;/div>&lt;/div>[Comment] =&amp;gt; Array&lt;br />
&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">[0] =&amp;gt; Array&lt;br />
&lt;div class="indent">&lt;div class="indent">(&lt;br />
&lt;div class="indent">&lt;div class="indent">[comment] =&amp;gt; Comment 1&lt;br />
&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>    [user_id] =&amp;gt; 1&lt;br />
&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">)&lt;br />
&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>    [1] =&amp;gt; Array&lt;br />
&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">(&lt;br />
&lt;div class="indent">&lt;div class="indent">[comment] =&amp;gt; Comment 2&lt;br />
&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>    [user_id] =&amp;gt; 2&lt;br />
&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">)&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>
Команда для&amp;nbsp;сохранения этого массива $data будет выглядеть так:&lt;br />
&amp;lt;? $this-&amp;gt;Article-&amp;gt;saveAll($data); ?&amp;gt; &lt;a name="h814-1">&lt;/a>&lt;h3> Сохранение данных ассоциированных моделей (hasOne, hasMany, belongsTo)&lt;/h3>
Когда работаете с&amp;nbsp;ассоциированными моделями, то&amp;nbsp;важно осознавать, что&amp;nbsp;сохранение данных модели должно быть сделано соответствующей моделью. Если вы&amp;nbsp;сохраняете новый пост (Post) и&amp;nbsp;ассоциированные ему&amp;nbsp;комментарии (Comments),  то&amp;nbsp;вы будете использовать обе&amp;nbsp;модели Post и&amp;nbsp;Comment.&lt;br />
Если ни&amp;nbsp;одна запись ассоциированных моделей еще&amp;nbsp;не&amp;nbsp;существует (например, вы&amp;nbsp;хотите сохранить нового пользователя (User) и&amp;nbsp;его записи профиля (Profile) в&amp;nbsp;одно и&amp;nbsp;то же&amp;nbsp;время), то&amp;nbsp;вам надо сначала сохранить первичную, или&amp;nbsp;родительскую модель.&lt;br />
Для&amp;nbsp;того, чтобы представить, как&amp;nbsp;это работает, предположим, что&amp;nbsp;у&amp;nbsp;нас есть действие в&amp;nbsp;нашем &lt;!--notypo-->UsersController&lt;!--/notypo-->, которое управляет сохранением нового пользователя (User) и&amp;nbsp;относящегося к&amp;nbsp;нему профиля (Profile). Пример действия, представленный ниже, предполагает, что&amp;nbsp;вы&amp;nbsp;внесли достаточно данных (используюя &lt;!--notypo-->FormHelper&lt;!--/notypo-->) для&amp;nbsp;создания пользователя и&amp;nbsp;профиля. &lt;br />
&amp;lt;?php&lt;br />
function add() {&lt;br />
&lt;div class="indent">if (!empty($this-&amp;gt;data)) {&lt;br />
&lt;div class="indent">// Мы&amp;nbsp;можем сохранить данные о&amp;nbsp;пользователе:&lt;br />
// они&amp;nbsp;будут в $this-&amp;gt;data['User']&lt;br />
$user = $this-&amp;gt;User-&amp;gt;save($this-&amp;gt;data);&lt;br />
// Если пользователь был&amp;nbsp;сохранен, то&amp;nbsp;мы добавляем эту&amp;nbsp;информацию&lt;br />
// в&amp;nbsp;данные и&amp;nbsp;сохраняем профиль.&lt;br />
&lt;div class="indent">&lt;br />
&lt;/div>if (!empty($user)) {&lt;br />
&lt;div class="indent">// ID&amp;nbsp;только что&amp;nbsp;созданного пользователя хранится&lt;br />
// в $this-&amp;gt;User-&amp;gt;id.&lt;br />
$this-&amp;gt;data['Profile']['user_id'] = $this-&amp;gt;User-&amp;gt;id;&lt;br />
// Поскольку наш&amp;nbsp;пользователь имеет один (hasOne) профиль,  то&amp;nbsp;&lt;br />
// у&amp;nbsp;нас есть доступ к&amp;nbsp;модели Profile через модель User:&lt;br />
$this-&amp;gt;User-&amp;gt;Profile-&amp;gt;save($this-&amp;gt;data);&lt;br />
&lt;/div>}&lt;br />
&lt;/div>}&lt;/div>&lt;/div>&lt;/div>
</description>
</item>
<item>
<title>2009-02-19 21:12:47</title>
<link>http://cake-php.ru/wiki/Manual/Developing/Models/Saving/show?time=2009-02-19+21%3A12%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/Manual/Developing/Models/Saving" class="">/Manual&amp;nbsp;/&amp;nbsp;Developing&amp;nbsp;/&amp;nbsp;Models&amp;nbsp;/&amp;nbsp;Saving&lt;/a> за &lt;a href="http://cake-php.ru/wiki/Manual/Developing/Models/Saving?time=2009-02-19+21%3A12%3A47">2009-02-19 21:12:47&lt;/a> и &lt;a href="http://cake-php.ru/wiki/Manual/Developing/Models/Saving?time=2009-02-20+14%3A01%3A53">2009-02-20 14:01:53&lt;/a>&lt;/b>&lt;br />
&lt;br />
&lt;b>Добавлено:&lt;/b>&lt;br />
&lt;div class="additions">Массив $fields принимает SQL&amp;nbsp;выражения. Буквенные значения следует брать в&amp;nbsp;кавычки.&lt;br />
Например, для&amp;nbsp;бронирования всех билетов для&amp;nbsp;конкретного заказчика можно написать такой код:&lt;br />
$this-&amp;gt;Ticket-&amp;gt;updateAll(&lt;br />
&lt;div class="indent">&lt;div class="indent">array('&lt;span class="missingpage">Ticket.status&lt;/span>&lt;a href="http://cake-php.ru/wiki/Ticket/status/edit?add=1" title="Создать эту страницу">?&lt;/a>' =&amp;gt; &amp;#147;'closed'"),&lt;br />
array('&lt;span class="missingpage">Ticket.customer_id&lt;/span>&lt;a href="http://cake-php.ru/wiki/Ticket/customerid/edit?add=1" title="Создать эту страницу">?&lt;/a>' =&amp;gt; 453)&lt;br />
&lt;/div> &lt;strong>saveAll(array $data = null, array $options = array())&lt;/strong>&lt;/div>
Исользуется для&amp;nbsp;сохранения&lt;br />
&amp;ndash; многочисленных записей для&amp;nbsp;одной модели&lt;br />
&amp;ndash; текущей записи со&amp;nbsp;всеми ассоциированными записями&lt;br />
Следующие опции могут быть использованы:&lt;br />
validate: Установите в&amp;nbsp;false для&amp;nbsp;отключения проверки валидности, true &amp;ndash; для&amp;nbsp;проверки валидности каждой записи перед сохранением, 'first' &amp;ndash; для&amp;nbsp;проверки *all* записей перед началом сохранения, или&amp;nbsp;'only' &amp;ndash; только для&amp;nbsp;проверки, но&amp;nbsp;без их&amp;nbsp;последующего сохранения.&lt;br />
atomic: Если true (по умолчанию), то&amp;nbsp;попытается сохранить все&amp;nbsp;записи в&amp;nbsp;одной транзакции. Должен быть установлен в&amp;nbsp;false, если база данных/таблица не&amp;nbsp;поддерживает транзакции. Если false, то&amp;nbsp;будет возвращен массив, похожий на&amp;nbsp;переданный массив $data, но&amp;nbsp;значения будут установлены в&amp;nbsp;true/false, в&amp;nbsp;зависимости от&amp;nbsp;того успешно была сохранена данная запись или&amp;nbsp;нет.&lt;br />
fieldList: Эквивалент параметра $fieldList в&amp;nbsp;Model::save()&lt;br />
Для&amp;nbsp;сохранения множества записей одной модели, $data должен быть численно проиндексирован:&lt;br />
&lt;div class="indent">[0] =&amp;gt; Array&lt;br />
&lt;div class="indent">(&lt;br />
&lt;div class="indent">[title] =&amp;gt; title 1&lt;br />
&lt;/div>)&lt;br />
&lt;/div>[1] =&amp;gt; Array&lt;br />
&lt;div class="indent">(&lt;br />
&lt;div class="indent">[title] =&amp;gt; title 2&lt;br />
&lt;/div>)&lt;/div>&lt;/div>
Команда для&amp;nbsp;сохранения данных, приведенных выше, будет выглядеть так:&lt;br />
&lt;!--notypo-->&lt;div class="code">&lt;code>&lt;span style="color: #000000">
&lt;span style="color: #0000BB">&amp;lt;?&amp;nbsp;$this&lt;/span>&lt;span style="color: #007700">-&amp;gt;&lt;/span>&lt;span style="color: #0000BB">Article&lt;/span>&lt;span style="color: #007700">-&amp;gt;&lt;/span>&lt;span style="color: #0000BB">saveAll&lt;/span>&lt;span style="color: #007700">(&lt;/span>&lt;span style="color: #0000BB">$data&lt;/span>&lt;span style="color: #007700">[&lt;/span>&lt;span style="color: #DD0000">'Article'&lt;/span>&lt;span style="color: #007700">]);&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">?&amp;gt;&lt;/span>
&lt;/span>
&lt;/code>&lt;/div>&lt;!--/notypo-->&lt;br />
Для&amp;nbsp;сохранения записи вместе со&amp;nbsp;связанной записью, имеющей ассоциации hasOne или&amp;nbsp;belongsTo, массив данных должен выглядеть так:&lt;br />
&lt;div class="indent">&lt;div class="indent">[User] =&amp;gt; Array&lt;br />
&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">[username] =&amp;gt; billy&lt;br />
&lt;/div>&lt;/div>&lt;/div>&lt;/div>[Profile] =&amp;gt; Array&lt;br />
&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">[sex] =&amp;gt; Male&lt;br />
&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>    [occupation] =&amp;gt; Programmer&lt;/div>&lt;/div>&lt;/div>
</description>
</item>
<item>
<title>2009-02-19 21:12:24</title>
<link>http://cake-php.ru/wiki/Manual/Developing/Models/Saving/show?time=2009-02-19+21%3A12%3A24</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/Manual/Developing/Models/Saving" class="">/Manual&amp;nbsp;/&amp;nbsp;Developing&amp;nbsp;/&amp;nbsp;Models&amp;nbsp;/&amp;nbsp;Saving&lt;/a> за &lt;a href="http://cake-php.ru/wiki/Manual/Developing/Models/Saving?time=2009-02-19+21%3A12%3A24">2009-02-19 21:12:24&lt;/a> и &lt;a href="http://cake-php.ru/wiki/Manual/Developing/Models/Saving?time=2009-02-19+21%3A12%3A47">2009-02-19 21:12:47&lt;/a>&lt;/b>&lt;br />
&lt;br />
&lt;b>Добавлено:&lt;/b>&lt;br />
&lt;div class="additions">Используется для&amp;nbsp;сохранения значений отдельных полей. Просто установите ID&amp;nbsp;($this-&amp;gt;&lt;!--notypo-->ModelName&lt;!--/notypo-->-&amp;gt;id = $id) перед вызовом saveField(). Когда используете этот метод, то $fieldName должно содержать только имя&amp;nbsp;поля, а&amp;nbsp;не имя&amp;nbsp;модели и&amp;nbsp;поля.&lt;/div>&lt;br />
&lt;b>Удалено:&lt;/b>&lt;br />
&lt;div class="deletions">Используется для&amp;nbsp;сохранения значений отдельных полей. Просто установите ID&amp;nbsp;($this-&amp;gt;&lt;span class="missingpage">Model&amp;nbsp;Name&lt;/span>&lt;a href="http://cake-php.ru/wiki/ModelName/edit?add=1" title="Создать эту страницу">?&lt;/a>-&amp;gt;id = $id) перед вызовом saveField(). Когда используете этот метод, то $fieldName должно содержать только имя&amp;nbsp;поля, а&amp;nbsp;не имя&amp;nbsp;модели и&amp;nbsp;поля.&lt;/div>&lt;/div>
</description>
</item>
</channel>
</rss>
