CakePHP HABTM - я этого не понимаю - PullRequest
2 голосов
/ 08 января 2012

Спрашивали раньше, но все еще в темноте.

cakePHP HABTM, я все неправильно поняла?

Попробую еще раз:
У меня есть две таблицы: stores и managers
Я хочу создать новую таблицу manager_stores и использовать ее для хранения полного списка менеджеров для каждого магазина.
Я понял, что каждое действие save(), которое предоставит полные данные записи (как я собираюсь сделать), приведет к удалению строк таблицы, и будет сохранена только новая запись.
Это нежелательное поведение для моих нужд. Итак, как мне управлять информацией HABTM моего приложения и какова идея удаления сохраненных данных?!

спасибо

Ответы [ 2 ]

7 голосов
/ 08 января 2012

save() ничего не удалит, только сохранение с saveAll() урежет записи managers_stores для конкретной модели, которую вы сохраняете, , если значение отношения unique равно true.Это не совсем понятно в руководстве:

unique: Если торт true (значение по умолчанию) сначала удалит существующие записи отношений в таблице внешних ключей перед вставкой новых, при обновлениизапись.Таким образом, существующие ассоциации должны быть переданы снова при обновлении.

http://book.cakephp.org/1.3/en/view/1044/hasAndBelongsToMany-HABTM

Всякий раз, когда вы save() индивидуальная запись, будет затронута только эта индивидуальная запись.
КогдаВы, saveAll() a, скажем, Manager запись со связанными Store записями за один раз, ссылки managers_stores будут сброшены, и только Менеджеры, которые были в сохраненной вами записи, будут связаны с Менеджером.Например (в псевдокоде):

  • Менеджер HABTM хранит 1, 2 и 3
  • Manager->saveAll(array('Manager' => ..., 'Store' => array(4, 5, 6)))
  • Менеджер теперь HABTM хранит 4, 5 и 6;существующие ассоциации были перезаписаны

Итак, либо установите значение unique в ассоциации на false, если вам не нравится это поведение, либо управляйте записями HABTM вручную.Честно говоря, для любого наполовину сложного приложения использование автоматизированной обработки отношений HABTM в Cake может оказаться довольно хрупким и сложным для отладки, поэтому я всегда сам управляю записями HABTM.

$this->Manager->save(...);
$this->Manager->ManagersStore->save(array('manager_id' => $this->Manager->id,
                                          'store_id'   => 42));
1 голос
/ 08 января 2012

«Имеет и принадлежит многим» - это то, где объекты свободно связаны друг с другом.Если вы использовали аналогию stores и managers, в одном магазине много менеджеров, а у одного менеджера много магазинов (не знаете, как это работает, может быть, они бродят менеджерами?: P).

Во-первых, ядумаю, что пример, который вы используете с менеджерами магазинов, не HABTM.Это просто один store имеет много managers, а не много stores.Использование HABTM означает, что менеджеры могут принадлежать нескольким магазинам одновременно!Однако я все равно объясню.

В любом случае, при использовании HABTM для этого отношения требуется промежуточная таблица, которая, вероятно, называется manager_stores или что-то подобное.Это будет автоматически установлено CakePHP при использовании автоматизированных инструментов.Это позволяет связать неограниченное количество менеджеров с неограниченным количеством магазинов.

Что происходит при обновлении и удалении записей, зависит от конфигурации ваших отношений MySQL (вам необходимо использовать механизм InnoDB).

Это независимо от того, какой тип отношений вы используете .

Если вы используете phpMyAdmin, перейдите в структурное представление своей таблицы.Затем нажмите «представление отношений».

Если вы правильно настроили InnoDB, вы должны увидеть отношения и два столбца с надписями «ON UPDATE» и «ON DELETE».Это определяет поведение при изменении записей.

Я бы здесь весь день объяснял различные типы действий ON DELETE и ON UPDATE.Попробуйте провести исследование запросов к реляционной базе данных!

Надеюсь, это вам немного поможет.Я с радостью отвечу на любые ваши вопросы!

...