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