CakePHP - Manual/Developing/Models/Associations /wiki/Manual/Developing/Models/Associations History/revisions of CakePHP/Manual/Developing/Models/Associations en-us 2009-02-28 21:07:36 /wiki/Manual/Developing/Models/Associations/show?time=2009-02-28+21%3A07%3A36 <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.associations" href="/wiki/Manual/Developing/Models/Associations" class="">/Manual&nbsp;/&nbsp;Developing&nbsp;/&nbsp;Models&nbsp;/&nbsp;Associations</a> за <a href="/wiki/Manual/Developing/Models/Associations?time=2009-02-28+21%3A07%3A36">2009-02-28 21:07:36</a> и <a href="/wiki/Manual/Developing/Models/Associations">2009-02-28 21:11:29</a></b><br /> <br /> <b>Добавлено:</b><br /> <div class="additions">За&nbsp;дополнительной информацией по&nbsp;связыванию моделей на&nbsp;лету, <br /> смотрите 'Создание и&nbsp;уничтожение ассоциаций на&nbsp;лету.'<br /> Удаление или&nbsp;добавление ассоциаций с&nbsp;использованием bind- и&nbsp;unbindModel() работает только <br /> для&nbsp;следующей операции модели, пока второй параметр не&nbsp;установлен в&nbsp;false. <br /> Если второй параметр установлен в&nbsp;false, то&nbsp;bind останется и&nbsp;для других запросов.</div><br /> <b>Удалено:</b><br /> <div class="deletions">За&nbsp;дополнительной информацией по&nbsp;связыванию моделей на&nbsp;лету, смотрите 'Создание и&nbsp;уничтожение ассоциаций на&nbsp;лету.'<br /> Удаление или&nbsp;добавление ассоциаций с&nbsp;использованием bind- и&nbsp;unbindModel() работает только для&nbsp;следующей операции модели, пока второй параметр не&nbsp;установлен в&nbsp;false. Если второй параметр установлен в&nbsp;false, то&nbsp;bind останется и&nbsp;для других запросов.</div></div> 2009-02-28 20:47:53 /wiki/Manual/Developing/Models/Associations/show?time=2009-02-28+20%3A47%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/Associations" class="">/Manual&nbsp;/&nbsp;Developing&nbsp;/&nbsp;Models&nbsp;/&nbsp;Associations</a> за <a href="/wiki/Manual/Developing/Models/Associations?time=2009-02-28+20%3A47%3A53">2009-02-28 20:47:53</a> и <a href="/wiki/Manual/Developing/Models/Associations?time=2009-02-28+21%3A07%3A36">2009-02-28 21:07:36</a></b><br /> <br /> <b>Добавлено:</b><br /> <div class="additions"><!--notypo--><div class="code"><code><span style="color: #000000"> Имя&nbsp;таблицы,&nbsp;по&nbsp;соглашению,&nbsp;в&nbsp;алфавитном&nbsp;порядке.</span> </code></div><!--/notypo--><br /> <ul><li> <strong>with</strong>: Определяет имя&nbsp;модели для&nbsp;соединяющей таблицы. По&nbsp;умолчанию <!--notypo-->CakePHP<!--/notypo--> автоматически создаст модель. Для&nbsp;примера, приведенного выше, это&nbsp;будет <!--notypo-->RecipesTag<!--/notypo-->. Используя этот индекс, вы&nbsp;можете изменить это&nbsp;имя, данное по&nbsp;умолчанию. Модель соединяющей таблицы может быть использована также, как&nbsp;любая стандартная модель, для&nbsp;прямого доступа к&nbsp;соединяющей таблице.</li></ul> $this-&gt;Recipe-&gt;bindModel(array('hasOne' =&gt; array('<!--notypo-->RecipesTag<!--/notypo-->')));<br /> <div class="indent"><div class="indent">'conditions'=&gt;array('<!--notypo-->RecipesTag.tag_id<!--/notypo-->'=&gt;124) // id&nbsp;тега &laquo;десерт&raquo;<br /> '<!--notypo-->RecipesTag<!--/notypo-->',<br /> <div class="indent">'conditions' =&gt; array('<span class="missingpage">Filter&nbsp;Tag.id</span><a href="/wiki/FilterTag/id/edit?add=1" title="Создать эту страницу">?</a> = <!--notypo-->RecipesTag.id<!--/notypo-->')</div></div></div> Теперь, в&nbsp;контроллере <!--notypo-->LeadersController<!--/notypo-->, мы&nbsp;можем использовать метод find() в&nbsp;модели Leader, для&nbsp;получения лидера и&nbsp;всех ассоциированных к&nbsp;нему последователей. Как&nbsp;вы&nbsp;могли видеть выше &ndash; ассоциативный массив в&nbsp;модели Leader определяет связь &#147;Leader hasMany Followers&#148;. В&nbsp;качестве демонстрации, давайте используем unbindModel() для&nbsp;удаления ассоциации в&nbsp;действии контроллера. <br /> Теперь, когда мы&nbsp;успешно удалили ассоциацию на&nbsp;лету, давайте добавим её. Наши, пока что, безпринципные лидеры нуждаются в&nbsp;ассоциированных принципах. Файл модели Principle &ndash; пустой, за&nbsp;исключением выражения var $name. Давайте привяжем нашим лидерам некоторые принципы на&nbsp;лету (но помните, что&nbsp;только для&nbsp;следующей find операции). Эта&nbsp;функция появляется в&nbsp;<!--notypo-->LeadersController<!--/notypo-->: <br /> Основное использование bindModel() &ndash; включение нормального ассоциативного массива в&nbsp;массив, чей&nbsp;индекс называется после типа ассоциации, которую вы&nbsp;хотите создать: <br /> <div class="indent"><div class="indent"><div class="indent"><div class="indent"><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></div></div> Несмотря на&nbsp;то, что&nbsp;вновь привязанная модель, не&nbsp;нуждается в&nbsp;определении ассоциации в&nbsp;своем файле модели, необходимо корректно задать индексы, для&nbsp;правильной работы ассоциации.<br /> <span class="missingpage">&lt;&lt; Удаление данных</span><a href="/wiki/deleting/edit?add=1" title="Создать эту страницу">?</a> | <span class="missingpage">Колбэки &gt;&gt;</span><a href="/wiki/callbacks/edit?add=1" title="Создать эту страницу">?</a></div><br /> <b>Удалено:</b><br /> <div class="deletions">Имя&nbsp;таблицы, по&nbsp;соглашению, в&nbsp;алфавитном порядке.<br /> <ul><li> <strong>with</strong>: Определяет имя&nbsp;модели для&nbsp;соединяющей таблицы. По&nbsp;умолчанию <!--notypo-->CakePHP<!--/notypo--> автоматически создаст модель. Для&nbsp;примера, приведенного выше, это&nbsp;будет <span class="missingpage">Recipes&nbsp;Tag</span><a href="/wiki/RecipesTag/edit?add=1" title="Создать эту страницу">?</a>. Используя этот индекс, вы&nbsp;можете изменить это&nbsp;имя, данное по&nbsp;умолчанию. Модель соединяющей таблицы может быть использована также, как&nbsp;любая стандартная модель, для&nbsp;прямого доступа к&nbsp;соединяющей таблице.</li></ul> $this-&gt;Recipe-&gt;bindModel(array('hasOne' =&gt; array('RecipesTag')));<br /> <div class="indent"><div class="indent">'conditions'=&gt;array('<span class="missingpage">Recipes&nbsp;Tag.tag_id</span><a href="/wiki/RecipesTag/tagid/edit?add=1" title="Создать эту страницу">?</a>'=&gt;124) // id&nbsp;тега &laquo;десерт&raquo;<br /> 'RecipesTag',<br /> <div class="indent">'conditions' =&gt; array('<span class="missingpage">Filter&nbsp;Tag.id</span><a href="/wiki/FilterTag/id/edit?add=1" title="Создать эту страницу">?</a> = <span class="missingpage">Recipes&nbsp;Tag.id</span><a href="/wiki/RecipesTag/id/edit?add=1" title="Создать эту страницу">?</a>')</div></div></div> Теперь, в&nbsp;контроллере <span class="missingpage">Leaders&nbsp;Controller</span><a href="/wiki/LeadersController/edit?add=1" title="Создать эту страницу">?</a>, мы&nbsp;можем использовать метод find() в&nbsp;модели Leader, для&nbsp;получения лидера и&nbsp;всех ассоциированных к&nbsp;нему последователей. Как&nbsp;вы&nbsp;могли видеть выше &ndash; ассоциативный массив в&nbsp;модели Leader определяет связь &#147;Leader hasMany Followers&#148;. В&nbsp;качестве демонстрации, давайте используем unbindModel() для&nbsp;удаления ассоциации в&nbsp;действии контроллера. <br /> Теперь, когда мы&nbsp;успешно удалили ассоциацию на&nbsp;лету, давайте добавим её. Наши, пока что, безпринципные лидеры нуждаются в&nbsp;ассоциированных принципах. Файл модели Principle &ndash; пустой, за&nbsp;исключением выражения var $name. Давайте привяжем нашим лидерам некоторые принципы на&nbsp;лету (но помните, что&nbsp;только для&nbsp;следующей find операции). Эта&nbsp;функция появляется в&nbsp;<span class="missingpage">Leaders&nbsp;Controller</span><a href="/wiki/LeadersController/edit?add=1" title="Создать эту страницу">?</a>: <br /> The&nbsp;basic usage for&nbsp;bindModel() is&nbsp;the encapsulation of&nbsp;a normal association array inside an&nbsp;array whose key&nbsp;is&nbsp;named after the&nbsp;type of&nbsp;association you&nbsp;are trying to&nbsp;create: <br /> <div class="indent"><div class="indent"><div class="indent"><div class="indent"><div class="indent"><div class="indent"><div class="indent"><div class="indent"><div class="indent"><div class="indent">// normal association keys go&nbsp;here...</div></div></div></div></div></div></div></div></div></div></div></div> 2009-02-28 19:50:43 /wiki/Manual/Developing/Models/Associations/show?time=2009-02-28+19%3A50%3A43 <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/Associations" class="">/Manual&nbsp;/&nbsp;Developing&nbsp;/&nbsp;Models&nbsp;/&nbsp;Associations</a> за <a href="/wiki/Manual/Developing/Models/Associations?time=2009-02-28+19%3A50%3A43">2009-02-28 19:50:43</a> и <a href="/wiki/Manual/Developing/Models/Associations?time=2009-02-28+20%3A47%3A53">2009-02-28 20:47:53</a></b><br /> <br /> <b>Добавлено:</b><br /> <div class="additions">Такие же&nbsp;трюки связывания могут быть использованы для&nbsp;нумерации ваших HABTM моделей. Единственное предупреждение: нумерация требует два&nbsp;запроса (один для&nbsp;подсчета количества записей, а&nbsp;другой &ndash; для&nbsp;получения данных). Передавайте параметр false в&nbsp;bindModel(); который скажет <!--notypo-->CakePHP<!--/notypo--> сохранять связь для&nbsp;множества запросов, а&nbsp;не для&nbsp;одного (по умолчанию). Обращайтесь к&nbsp;API за&nbsp;дополнительной информацией.<br /> За&nbsp;дополнительной информацией по&nbsp;связыванию моделей на&nbsp;лету, смотрите 'Создание и&nbsp;уничтожение ассоциаций на&nbsp;лету.'<a name="h816-1"></a><h3>Создание и&nbsp;уничтожение ассоциаций на&nbsp;лету</h3> Иногда необходимо создать и&nbsp;уничтожить ассоциацию моделей на&nbsp;лету. Это&nbsp;может понадобиться по&nbsp;различным причинам:<br /> <ul><li> Вы&nbsp;хотите уменьшить количество выбираемых ассоциированных данных, но&nbsp;все ваши ассоциации &ndash; на&nbsp;первом уровне рекурсии. </li><li> Вы&nbsp;хотите изменить определение ассоциации, для&nbsp;сортировки или&nbsp;фильтрации данных.</li></ul> Создание и&nbsp;удаление этих ассоциаций производится с&nbsp;помощью методов bindModel() и&nbsp;unbindModel(). (Также есть очень полезное поведение &#147;Containable&#148;, смотрите раздел руководства о&nbsp;встроенных поведениях, для&nbsp;дополнительной информации.). Давайте создадим несколько моделей, чтобы мы&nbsp;могли увидеть как&nbsp;работают bindModel() и&nbsp;unbindModel(). Мы&nbsp;начнем с&nbsp;двух моделей: <br /> class Leader 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 $name = 'Leader';<br /> <div class="indent"><div class="indent">'Follower' =&gt; array(<br /> <div class="indent"><div class="indent">'className' =&gt; 'Follower',<br /> 'order' =&gt; '<span class="missingpage">Follower.rank</span><a href="/wiki/Follower/rank/edit?add=1" title="Создать эту страницу">?</a>'</div></div></div></div></div></div> class Follower 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 $name = 'Follower';</div></div> Теперь, в&nbsp;контроллере <span class="missingpage">Leaders&nbsp;Controller</span><a href="/wiki/LeadersController/edit?add=1" title="Создать эту страницу">?</a>, мы&nbsp;можем использовать метод find() в&nbsp;модели Leader, для&nbsp;получения лидера и&nbsp;всех ассоциированных к&nbsp;нему последователей. Как&nbsp;вы&nbsp;могли видеть выше &ndash; ассоциативный массив в&nbsp;модели Leader определяет связь &#147;Leader hasMany Followers&#148;. В&nbsp;качестве демонстрации, давайте используем unbindModel() для&nbsp;удаления ассоциации в&nbsp;действии контроллера. <br /> function someAction() {<br /> <div class="indent"><div class="indent">// Это&nbsp;выбирает лидера и&nbsp;его ассоциированных последователей<br /> $this-&gt;Leader-&gt;findAll();<br /> </div><br /> <div class="indent">// Давайте удалим hasMany...<br /> $this-&gt;Leader-&gt;unbindModel(<br /> <div class="indent"><div class="indent">array('hasMany' =&gt; array('Follower'))<br /> </div></div></div><br /> <div class="indent">// Теперь функция find вернет<br /> // Лидеров, без&nbsp;последователей<br /> $this-&gt;Leader-&gt;findAll();<br /> </div><br /> <div class="indent">// Внимание: unbindModel влияет только на&nbsp;следующую <br /> // функцию find. Дополнительный вызов find call будет <br /> // использовать заданную информацию об&nbsp;ассоциации.<br /> </div><br /> <div class="indent">// Мы&nbsp;уже использовали findAll() после unbindModel(), <br /> // так&nbsp;что, этот вызов снова вернет лидеров с&nbsp;<br /> // последователями...<br /> $this-&gt;Leader-&gt;findAll();</div></div> Удаление или&nbsp;добавление ассоциаций с&nbsp;использованием bind- и&nbsp;unbindModel() работает только для&nbsp;следующей операции модели, пока второй параметр не&nbsp;установлен в&nbsp;false. Если второй параметр установлен в&nbsp;false, то&nbsp;bind останется и&nbsp;для других запросов.<br /> Здесь базовый пример использования unbindModel(): <br /> $this-&gt;Model-&gt;unbindModel(<br /> <div class="indent"><div class="indent">array('associationType' =&gt; array('associatedModelClassName'))</div></div> );<br /> Теперь, когда мы&nbsp;успешно удалили ассоциацию на&nbsp;лету, давайте добавим её. Наши, пока что, безпринципные лидеры нуждаются в&nbsp;ассоциированных принципах. Файл модели Principle &ndash; пустой, за&nbsp;исключением выражения var $name. Давайте привяжем нашим лидерам некоторые принципы на&nbsp;лету (но помните, что&nbsp;только для&nbsp;следующей find операции). Эта&nbsp;функция появляется в&nbsp;<span class="missingpage">Leaders&nbsp;Controller</span><a href="/wiki/LeadersController/edit?add=1" title="Создать эту страницу">?</a>: <br /> function anotherAction() {<br /> <div class="indent"><div class="indent">// в&nbsp;файле leader.php нет&nbsp;Leader hasMany Principles <br /> // таким образом, find выберет только лидеров<br /> $this-&gt;Leader-&gt;findAll();<br /> // Используем bindModel() для&nbsp;добавления новой<br /> // ассоциации в&nbsp;модель Leader:<br /> $this-&gt;Leader-&gt;bindModel(<br /> <div class="indent"><div class="indent">array('hasMany' =&gt; array(<br /> <div class="indent"><div class="indent"><div class="indent"><div class="indent">'Principle' =&gt; array(<br /> <div class="indent"><div class="indent">'className' =&gt; 'Principle'<br /> </div></div></div></div></div></div></div></div>// Теперь мы&nbsp;можем использовать одну find функцию для<br /> // получения лидеров и&nbsp;их принципов:<br /> $this-&gt;Leader-&gt;findAll();</div></div> The&nbsp;basic usage for&nbsp;bindModel() is&nbsp;the encapsulation of&nbsp;a normal association array inside an&nbsp;array whose key&nbsp;is&nbsp;named after the&nbsp;type of&nbsp;association you&nbsp;are trying to&nbsp;create: <br /> $this-&gt;Model-&gt;bindModel(<br /> <div class="indent"><div class="indent"><div class="indent"><div class="indent">array('associationName' =&gt; array(<br /> <div class="indent"><div class="indent"><div class="indent"><div class="indent">'associatedModelClassName' =&gt; array(<br /> <div class="indent"><div class="indent">// normal association keys go&nbsp;here...</div></div></div></div></div></div></div></div></div></div></div></div> 2009-02-28 18:58:35 /wiki/Manual/Developing/Models/Associations/show?time=2009-02-28+18%3A58%3A35 <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/Associations" class="">/Manual&nbsp;/&nbsp;Developing&nbsp;/&nbsp;Models&nbsp;/&nbsp;Associations</a> за <a href="/wiki/Manual/Developing/Models/Associations?time=2009-02-28+18%3A58%3A35">2009-02-28 18:58:35</a> и <a href="/wiki/Manual/Developing/Models/Associations?time=2009-02-28+19%3A50%3A43">2009-02-28 19:50:43</a></b><br /> <br /> <b>Добавлено:</b><br /> <div class="additions">Помните, что&nbsp;надо определить HABTM ассоциацию в&nbsp;модели Tag, если вы&nbsp;пожелаете выбирать данные модели Recipe из&nbsp;модели Tag.<br /> Также возможно выполнять пользовательские find запросы, на&nbsp;основе HABTM отношений. Рассмотрим следующий пример:<br /> Возьмем ту&nbsp;же структуру, как&nbsp;в&nbsp;примере выше (Recipe HABTM Tag). Допустим, мы&nbsp;хотим выбрать все&nbsp;рецепты с&nbsp;тегом 'десерт'. Один из&nbsp;вариантов (неверный) &ndash; применить условие непосредственно в&nbsp;определении ассоциации:<br /> &lt;?<br /> $this-&gt;Recipe-&gt;bindModel(array(<br /> <div class="indent">'hasAndBelongsToMany' =&gt; array(<br /> <div class="indent">'Tag' =&gt; array('conditions'=&gt;array('<span class="missingpage">Tag.name</span><a href="/wiki/Tag/name/edit?add=1" title="Создать эту страницу">?</a>'=&gt;'десерт'))</div></div> )));<br /> $this-&gt;Recipe-&gt;find('all');<br /> //полученные данные<br /> <div class="indent"><div class="indent">0 =&gt; Array<br /> <div class="indent"><div class="indent">{<br /> [Recipe] =&gt; Array<br /> <div class="indent"><div class="indent">(<br /> <div class="indent"><div class="indent">[id] =&gt; 2745<br /> [name] =&gt; Шоколад сахарные бомбы<br /> [created] =&gt; <span class="nobr">2007&ndash;05&ndash;01</span> 10:31:01<br /> [user_id] =&gt; 2346<br /> </div></div></div></div>[Tag] =&gt; Array<br /> <div class="indent"><div class="indent">(<br /> <div class="indent"> [0] =&gt; Array<br /> <div class="indent"><div class="indent"><div class="indent">(<br /> <div class="indent"><div class="indent">[id] =&gt; 124<br /> [name] =&gt; десерт<br /> </div></div>)<br /> </div></div></div></div></div></div></div></div>)<br /> 1 =&gt; Array<br /> <div class="indent"><div class="indent">{<br /> [Recipe] =&gt; Array<br /> <div class="indent"><div class="indent">(<br /> <div class="indent"><div class="indent">[id] =&gt; 2745<br /> [name] =&gt; крабовые пирожные<br /> [created] =&gt; <span class="nobr">2008&ndash;05&ndash;01</span> 10:31:01<br /> [user_id] =&gt; 2349<br /> </div></div></div></div>[Tag] =&gt; Array<br /> <div class="indent"><div class="indent">(<br /> }<br /> </div></div>}</div></div></div></div> Обратите внимание, что&nbsp;в&nbsp;данном случае были возвращены все&nbsp;рецепты, но&nbsp;только теги &laquo;десерт&raquo;. Есть несколько способов достижения нашей цели. Первый &ndash; это&nbsp;искать в&nbsp;модели Tag&nbsp;(вместо модели Recipe), это&nbsp;также даст нам&nbsp;все ассоциированные рецепты.<br /> &lt;?<br /> $this-&gt;Recipe-&gt;Tag-&gt;find('all', array('conditions'=&gt;array('<span class="missingpage">Tag.name</span><a href="/wiki/Tag/name/edit?add=1" title="Создать эту страницу">?</a>'=&gt;'десерт')));<br /> Мы&nbsp;также можем использовать модель соединяющей таблицы (которую <!--notypo-->CakePHP<!--/notypo--> предоставляет нам), для&nbsp;поиска по&nbsp;данному ID. <br /> &lt;?<br /> $this-&gt;Recipe-&gt;bindModel(array('hasOne' =&gt; array('RecipesTag')));<br /> $this-&gt;Recipe-&gt;find('all', array(<br /> <div class="indent"><div class="indent">'fields' =&gt; array('Recipe.*'),<br /> 'conditions'=&gt;array('<span class="missingpage">Recipes&nbsp;Tag.tag_id</span><a href="/wiki/RecipesTag/tagid/edit?add=1" title="Создать эту страницу">?</a>'=&gt;124) // id&nbsp;тега &laquo;десерт&raquo;</div></div> ));<br /> Также можно создать экзотическую ассоциацию для&nbsp;создания множества необходимых связей, для&nbsp;фильтрации, например:<br /> &lt;?<br /> $this-&gt;Recipe-&gt;bindModel(array(<br /> <div class="indent">'hasOne' =&gt; array(<br /> <div class="indent">'RecipesTag',<br /> 'FilterTag' =&gt; array(<br /> <div class="indent">'className' =&gt; 'Tag',<br /> 'foreignKey' =&gt; false,<br /> 'conditions' =&gt; array('<span class="missingpage">Filter&nbsp;Tag.id</span><a href="/wiki/FilterTag/id/edit?add=1" title="Создать эту страницу">?</a> = <span class="missingpage">Recipes&nbsp;Tag.id</span><a href="/wiki/RecipesTag/id/edit?add=1" title="Создать эту страницу">?</a>')</div></div></div> ))));<br /> $this-&gt;Recipe-&gt;find('all', array(<br /> <div class="indent"><div class="indent">'fields' =&gt; array('Recipe.*'),<br /> 'conditions'=&gt;array('<span class="missingpage">Filter&nbsp;Tag.name</span><a href="/wiki/FilterTag/name/edit?add=1" title="Создать эту страницу">?</a>'=&gt;'десерт')</div></div> ));<br /> //полученные данные<br /> <div class="indent"><div class="indent">0 =&gt; Array<br /> <div class="indent"><div class="indent">{<br /> [Recipe] =&gt; Array<br /> <div class="indent"><div class="indent">(<br /> <div class="indent"><div class="indent">[id] =&gt; 2745<br /> [name] =&gt; Chocolate Frosted Sugar Bombs<br /> [created] =&gt; <span class="nobr">2007&ndash;05&ndash;01</span> 10:31:01<br /> [user_id] =&gt; 2346</div></div></div></div></div></div></div></div></div></div> 2009-02-28 14:04:26 /wiki/Manual/Developing/Models/Associations/show?time=2009-02-28+14%3A04%3A26 <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/Associations" class="">/Manual&nbsp;/&nbsp;Developing&nbsp;/&nbsp;Models&nbsp;/&nbsp;Associations</a> за <a href="/wiki/Manual/Developing/Models/Associations?time=2009-02-28+14%3A04%3A26">2009-02-28 14:04:26</a> и <a href="/wiki/Manual/Developing/Models/Associations?time=2009-02-28+18%3A58%3A35">2009-02-28 18:58:35</a></b><br /> <br /> <b>Добавлено:</b><br /> <div class="additions">Возможные индексы для&nbsp;массивов HABTM ассоциаций:<br /> <ul><li> <strong>className</strong>: имя&nbsp;класса модели, ассоциированной к&nbsp;текущей модели. Если вы&nbsp;определяете отношение 'Recipe HABTM Tag', то&nbsp;индекс className должен быть равен 'Tag'. </li><li> <strong>joinTable</strong>: Имя&nbsp;соединяющей таблицы, используемой в&nbsp;данной ассоциации (если таблица названа без&nbsp;соблюдения соглашений для&nbsp;HABTM соединяющих таблиц). </li><li> <strong>with</strong>: Определяет имя&nbsp;модели для&nbsp;соединяющей таблицы. По&nbsp;умолчанию <!--notypo-->CakePHP<!--/notypo--> автоматически создаст модель. Для&nbsp;примера, приведенного выше, это&nbsp;будет <span class="missingpage">Recipes&nbsp;Tag</span><a href="/wiki/RecipesTag/edit?add=1" title="Создать эту страницу">?</a>. Используя этот индекс, вы&nbsp;можете изменить это&nbsp;имя, данное по&nbsp;умолчанию. Модель соединяющей таблицы может быть использована также, как&nbsp;любая стандартная модель, для&nbsp;прямого доступа к&nbsp;соединяющей таблице. </li><li> <strong>foreignKey</strong>: имя&nbsp;внешнего ключа, расположенного в&nbsp;текущей модели. Это&nbsp;особенно удобно если вам&nbsp;необходимо определить множество HABTM отношений. Значение по&nbsp;умолчанию &ndash; это&nbsp;единственное число имени текущей модели, затем символ подчеркивания и&nbsp;суффикс id. </li><li> <strong>associationForeignKey</strong>: имя&nbsp;внешнего ключа, расположенного в&nbsp;другой модели. Это&nbsp;особенно удобно если вам&nbsp;необходимо определить множество HABTM отношений. Значение по&nbsp;умолчанию &ndash; это&nbsp;единственное число имени другой модели, затем символ подчеркивания и&nbsp;суффикс id. </li><li> <strong>unique</strong>: Если true (значение по&nbsp;умолчанию), то&nbsp;кейк сначала удалит существующие записи в&nbsp;таблице внешнего ключа, перед вставкой новых, когда обновляете запись. Т.о. существующие ассоциации должны быть переданы снова во&nbsp;время обновления. </li><li> <strong>conditions</strong>: SQL&nbsp;код, используемый для&nbsp;фильтрации, связанных записей. Это&nbsp;хорошая практика &ndash; использовать имена моделей в&nbsp;SQL коде: '<!--notypo-->Comment.status<!--/notypo--> = 1' лучше, чем&nbsp;просто &laquo;status = 1.&raquo; </li><li> <strong>fields</strong>: Список полей, которые должны быть получены, когда выбираются данные ассоциируемых моделей. По&nbsp;умолчанию возвращаются все&nbsp;поля. </li><li> <strong>order</strong>: SQL&nbsp;код, который определяет порядок сортировки для&nbsp;возвращаемых записей. </li><li> <strong>limit</strong>: Максимальное число ассоциированных записей, которые вы&nbsp;хотите получить. </li><li> <strong>offset</strong>: Количество пропускаемых ассоциированных записей (для данных условий и&nbsp;сортировки), перед выбором и&nbsp;ассоциированием. </li><li> <strong>finderQuery, deleteQuery, insertQuery</strong>: Полные SQL&nbsp;запросы <!--notypo-->CakePHP<!--/notypo--> для&nbsp;выборки, удаления или&nbsp;создания новых записей. Это&nbsp;может быть использовано в&nbsp;ситуациях, которые требуют специальных результатов. </li></ul> После того, как&nbsp;эта ассоциация определена, find операции модели Recipe будут также выбирать записи связанной модели Tag, если такие существуют:<br /> //Пример результатов после вызова $this-&gt;Recipe-&gt;find().<br /> <div class="indent"><div class="indent">[Recipe] =&gt; Array<br /> <div class="indent"><div class="indent"><div class="indent"><div class="indent">[id] =&gt; 2745<br /> [name] =&gt; Chocolate Frosted Sugar Bombs<br /> [user_id] =&gt; 2346<br /> </div></div></div></div>[Tag] =&gt; Array<br /> <div class="indent"><div class="indent"><div class="indent"><div class="indent"><div class="indent"><div class="indent"><div class="indent"><div class="indent">[name] =&gt; Breakfast<br /> </div></div></div></div></div> [1] =&gt; Array<br /> <div class="indent"><div class="indent"><div class="indent"><div class="indent"><div class="indent">[id] =&gt; 124<br /> [name] =&gt; Dessert<br /> </div></div></div></div></div> [2] =&gt; Array<br /> <div class="indent"><div class="indent"><div class="indent"><div class="indent"><div class="indent">[id] =&gt; 125<br /> [name] =&gt; Heart Disease</div></div></div></div></div></div></div></div></div></div></div></div> 2009-02-27 12:51:06 /wiki/Manual/Developing/Models/Associations/show?time=2009-02-27+12%3A51%3A06 <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/Associations" class="">/Manual&nbsp;/&nbsp;Developing&nbsp;/&nbsp;Models&nbsp;/&nbsp;Associations</a> за <a href="/wiki/Manual/Developing/Models/Associations?time=2009-02-27+12%3A51%3A06">2009-02-27 12:51:06</a> и <a href="/wiki/Manual/Developing/Models/Associations?time=2009-02-28+14%3A04%3A26">2009-02-28 14:04:26</a></b><br /> <br /> <b>Добавлено:</b><br /> <div class="additions">HABTM требует отдельную связывающую таблицу, которая содержит имена обоих моделей.<br /> ||Recipe HABTM Tag&nbsp;|id, recipes_tags.recipe_id, recipes_tags.tag_id ||<br /> ||Cake HABTM Fan&nbsp;|id, cakes_fans.cake_id, cakes_fans.fan_id ||<br /> ||Foo HABTM Bar&nbsp;|id, bars_foos.foo_id, bars_foos.bar_id||<br /> Имя&nbsp;таблицы, по&nbsp;соглашению, в&nbsp;алфавитном порядке.<br /> После того, как&nbsp;эта новая таблица создана, мы&nbsp;можем определить HABTM ассоциацию в&nbsp;файлах моделей. В&nbsp;этот раз&nbsp;мы&nbsp;пропустим строковый синтаксис и&nbsp;перейдем сразу к&nbsp;определению ассоциации с&nbsp;помощью массива:<br /> class Recipe 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 $name = 'Recipe'; <br /> var $hasAndBelongsToMany = array(<br /> <div class="indent"><div class="indent">'Tag' =&gt;<br /> <div class="indent"><div class="indent">array(<br /> <div class="indent"><div class="indent"> 'className' =&gt; 'Tag',<br /> 'joinTable' =&gt; 'recipes_tags',<br /> 'with' =&gt; <span class="cite">,<br /> 'foreignKey' =&gt; 'recipe_id',<br /> 'associationForeignKey' =&gt; 'tag_id',<br /> 'unique' =&gt; true,<br /> 'conditions' =&gt; </span>,<br /> 'fields' =&gt; <span class="cite">,<br /> 'order' =&gt; </span>,<br /> 'limit' =&gt; <span class="cite">,<br /> 'offset' =&gt; </span>,<br /> 'finderQuery' =&gt; <span class="cite">,<br /> 'deleteQuery' =&gt; </span>,<br /> 'insertQuery' =&gt; ''<br /> </div></div>)</div></div></div></div></div></div></div></div> 2009-02-25 13:18:46 /wiki/Manual/Developing/Models/Associations/show?time=2009-02-25+13%3A18%3A46 <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/Associations" class="">/Manual&nbsp;/&nbsp;Developing&nbsp;/&nbsp;Models&nbsp;/&nbsp;Associations</a> за <a href="/wiki/Manual/Developing/Models/Associations?time=2009-02-25+13%3A18%3A46">2009-02-25 13:18:46</a> и <a href="/wiki/Manual/Developing/Models/Associations?time=2009-02-27+12%3A51%3A06">2009-02-27 12:51:06</a></b><br /> <br /> <b>Добавлено:</b><br /> <div class="additions">Давайте рассмотрим последний тип&nbsp;отношений: hasAndBelongsToMany, или&nbsp;HABTM. Эта&nbsp;ассоциация используется, когда у&nbsp;вас есть две&nbsp;модели, которые должны быть связаны многократно, множеством различных способов.<br /> Главное отличие между hasMany и&nbsp;HABTM &ndash; это&nbsp;то, что&nbsp;связь между моделями не&nbsp;исключающая. Например, мы&nbsp;соединяем нашу модель Recipe с&nbsp;моделью Tag, используя HABTM. Прикрепление тега &laquo;украинский&raquo; к&nbsp;бабушкиному рецепту борща, не&nbsp;&laquo;израсходует&raquo; этот тег. При&nbsp;необходимости, я&nbsp;могу прикрепить этот тег&nbsp;и&nbsp;к другим рецептам.<br /> Связи между объектами, ассоциированными через hasMany, &ndash; исключающие. Если User hasMany Comments, то&nbsp;комментарии принадлежит только определенному пользователю и&nbsp;не может быть привязан к&nbsp;другому. <br /> Идем дальше. Нам&nbsp;необходимо создать дополнительную таблицу в&nbsp;базе данных, для&nbsp;управления HABTM ассоциацией. Имя&nbsp;этой новой соединяющей таблицы должно состоять из&nbsp;имен двух используемых моделей (в алфавитном порядке), разделенных символом подчеркивания ( _ ). Таблица должна содержать два&nbsp;поля, внешние ключи (типа integer), указывающие на&nbsp;первичные ключи, используемых моделей. Чтобы избежать конфликтных ситуаций &ndash; не&nbsp;определяйте комбинированные первичные ключи для&nbsp;этих двух полей. Если это, все&nbsp;же, необходимо, то&nbsp;вы можете определить уникальный индекс. Если вы&nbsp;планируете добавить другую дополнительную информацию в&nbsp;эту таблицу, то&nbsp;добавьте поле с&nbsp;первичным ключом (по соглашению 'id'), чтобы вы&nbsp;могли работать с&nbsp;этой таблицей также легко, как&nbsp;с&nbsp;другими моделями.</div></div> 2009-02-25 13:04:40 /wiki/Manual/Developing/Models/Associations/show?time=2009-02-25+13%3A04%3A40 <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/Associations" class="">/Manual&nbsp;/&nbsp;Developing&nbsp;/&nbsp;Models&nbsp;/&nbsp;Associations</a> за <a href="/wiki/Manual/Developing/Models/Associations?time=2009-02-25+13%3A04%3A40">2009-02-25 13:04:40</a> и <a href="/wiki/Manual/Developing/Models/Associations?time=2009-02-25+13%3A18%3A46">2009-02-25 13:18:46</a></b><br /> <br /> <b>Добавлено:</b><br /> <div class="additions">Второй параметр метода Model-&gt;delete() должен быть установлен в&nbsp;true <br /> для&nbsp;включения рекурсивного удаления.<br /> Когда данная ассоциация определена, то&nbsp;find операции в&nbsp;модели User будут также выбирать записи связанной модели Comment, если таковые имеются:<br /> //Образец результата после вызова $this-&gt;User-&gt;find().<br /> ( <br /> <div class="indent"><div class="indent">[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">[id] =&gt; 123<br /> [user_id] =&gt; 121<br /> [title] =&gt; On&nbsp;Gwoo the&nbsp;Kungwoo<br /> [body] =&gt; The&nbsp;Kungwooness is&nbsp;not so&nbsp;Gwooish<br /> [created] =&gt; <span class="nobr">2006&ndash;05&ndash;01</span> 10:31:01<br /> </div></div>)<br /> </div></div>[1] =&gt; Array<br /> <div class="indent"><div class="indent">(<br /> <div class="indent"><div class="indent">[id] =&gt; 123<br /> [user_id] =&gt; 121<br /> [title] =&gt; More on&nbsp;Gwoo<br /> [body] =&gt; But&nbsp;what of&nbsp;the ‘Nut?<br /> [created] =&gt; <span class="nobr">2006&ndash;05&ndash;01</span> 10:41:01<br /> </div></div>)</div></div></div></div></div></div></div></div> Помните, что&nbsp;вам надо определить ассоциацию 'Comment belongsTo User' для&nbsp;того, чтобы получать данные в&nbsp;обоих направлениях. <a name="h816-1"></a><h3>hasAndBelongsToMany (HABTM)</h3> На&nbsp;данный момент вы&nbsp;можете называть себя профессионалом ассоциирования моделей в&nbsp;<!--notypo-->CakePHP<!--/notypo-->. Вы&nbsp;уже хорошо разбираетесь в&nbsp;трех видах ассоциаций, который охватывают основную массу отношений объектов.</div><br /> <b>Удалено:</b><br /> <div class="deletions">Второй параметр метода Model-&gt;delete() должен быть установлен в&nbsp;true для&nbsp;включения рекурсивного удаления.</div></div> 2009-02-25 12:34:59 /wiki/Manual/Developing/Models/Associations/show?time=2009-02-25+12%3A34%3A59 <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/Associations" class="">/Manual&nbsp;/&nbsp;Developing&nbsp;/&nbsp;Models&nbsp;/&nbsp;Associations</a> за <a href="/wiki/Manual/Developing/Models/Associations?time=2009-02-25+12%3A34%3A59">2009-02-25 12:34:59</a> и <a href="/wiki/Manual/Developing/Models/Associations?time=2009-02-25+13%3A04%3A40">2009-02-25 13:04:40</a></b><br /> <br /> <b>Добавлено:</b><br /> <div class="additions"><br /> <br /> <br /> Возможные индексы для&nbsp;массивов hasMany ассоциации: <br /> <ul><li> <strong>className</strong>: имя&nbsp;класса модели, ассоциируемой к&nbsp;данной. Если вы&nbsp;устанавливаете связь &#147;User hasMany Comment&#148;, то&nbsp;индексу className следует присвоить 'Comment'. </li><li> <strong>foreignKey</strong>: имя&nbsp;внешнего ключа, расположенного в&nbsp;другой модели. Индекс особенно удобен, если вам&nbsp;необходимо определить множество ассоциаций hasMany. Значение по&nbsp;умолчанию &ndash; это&nbsp;единственное число имени текущей модели, затем символ подчеркивания и&nbsp;суффикс id. </li><li> <strong>conditions</strong>: SQL&nbsp;код, используемый для&nbsp;фильтрации записей ассоциированной модели. Хороший тон&nbsp;&ndash; использовать имена моделей в&nbsp;SQL коде: ' <!--notypo-->Comment.user_id<!--/notypo--> = 1' всегда лучше, чем&nbsp;просто 'status = 1'. </li><li> <strong>order</strong>: SQL&nbsp;код, который определяет порядок сортировки для&nbsp;возвращаемых записей. </li><li> <strong>limit</strong>: Максимальное число ассоциированных записей, которые вы&nbsp;хотите получить. </li><li> <strong>offset</strong>: Количество пропускаемых ассоциированных записей (для данных условий и&nbsp;сортировки), перед выбором и&nbsp;ассоциированием. </li><li> <strong>dependent</strong>: Когда dependent установлен в&nbsp;true, то&nbsp;возможно рекурсивное удаление. Для&nbsp;данного примера, записи модели Comment будут удалены, когда связанная с&nbsp;ними запись пользователя будет удалена.</li></ul> Второй параметр метода Model-&gt;delete() должен быть установлен в&nbsp;true для&nbsp;включения рекурсивного удаления.<br /> <ul><li> <strong>exclusive</strong>: Когда exclusive установлен в&nbsp;true, то&nbsp;рекурсивное удаление доступно при&nbsp;вызове deleteAll(), вместо удаления каждого объекта по&nbsp;отдельности. Это&nbsp;существенно улучшает производительность, но&nbsp;не идеально подходит во&nbsp;всех случаях. </li><li> <strong>finderQuery</strong>: Полный SQL&nbsp;запрос, который <!--notypo-->Virtue.cake_id<!--/notypo--> может использовать для&nbsp;получения ассоциированных данных. Это&nbsp;может быть использовано в&nbsp;ситуациях, которые требуют специальных результатов. </li></ul> <!--notypo-->Option.product_id<!--/notypo--></div><br /> <b>Удалено:</b><br /> <div class="deletions">||User hasMany Comment |Comment.user_id ||<br /> ||Cake hasMany Virtue | Virtue.cake_id ||<br /> ||Product hasMany Option | Option.product_id||</div></div>