Propel: как удалить ссылку, созданную с помощью отношения «многие ко многим» - PullRequest
0 голосов
/ 28 апреля 2011

(ссылка на предыдущий вопрос на всякий случай: Борьба с отношением один-ко-многим в форме администратора )

У меня такое отношение ко многим в моем Symfony-1.3 / Проект Propel-1.4 между Пользователь и Партнер .Когда пользователь сохраняется, если он имеет определенный логический флаг, являющийся истинным, я хочу очистить все ссылки на партнеров.Вот что я делаю в данный момент, и это не работает:

// inside the User model class
public function save(PropelPDO $con = null) {
  if ($this->getIsBlaBla()) {
    $this->setStringProperty(NULL);
    $this->clearUserPartners();
  }
  parent::save($con);
}

Установка свойства строки в NULL работает;глядя на БД это наглядно показывает.Однако дело в том, что таблица USER_PARTNER по-прежнему содержит отношения между пользователями и партнерами.Поэтому я решил очистить ссылки одну за другой, например:

foreach($this->getUserPartners() as $user_partner) {
  $user_partner->delete();
  //UserPartnerPeer::doDelete($user_partner); // tried that too
}

И то, и другое не помогает.

Как я уже говорил в моем предыдущем вопросе, я простоSymfony изучает обезьяну методом проб и ошибок, поэтому я, очевидно, упускаю что-то очень очевидное.Пожалуйста, укажите мне правильное направление!

РЕДАКТИРОВАТЬ: Вот как я сделал это работает:

Переместил код в класс Form, например, так:

public function doSave(PropelPDO $con = null) {
  parent::doSave($con);

  if ($this->getObject()->getIsSiteOwner()) {
    $this->getObject()->setType(NULL);
    $this->getObject()->save();

    foreach($this->getObject()->getUserPartners() as $user_partner) {
      $user_partner->delete();
    }
  }

  return $this->getObject();
}

public function updateObject($values = null) {
  $obj = parent::updateObject($values);

  if ($obj->getIsSiteOwner()) {
    $obj->clearUserPartners();
  }

  return $this->object;
}

Что это делает:

  • Когда установлен логический флаг `is_site_owner`, он очищает поле` type` и ** сохраняет ** объект (стыдно, что у меня нетпонял это так долго).
  • Удаляет все существующие объекты ссылок «многие ко многим» для UserPartner.
  • Удаляет вновь связанные (через DoubleList) отношения UserPartner.1035 * Что мне и нужно.Спасибо всем, кто участвовал.

Ответы [ 4 ]

1 голос
/ 28 апреля 2011

Хорошо, теперь у вас есть отношение «многие ко многим», когда в терминах базы данных реализованы три таблицы (User, Parter и UserPartner).То же самое происходит в Symfony и Propel, поэтому вам нужно сделать что-то подобное с методом doSave, который должен быть объявлен в UserForm:

public function doSave($con = null)
{
 parent::doSave($con); //First all that's good and nice from propel
 if ($this->getValue('please_errase_my_partners_field'))
 {
  foreach($this->getObject()->getUserPartners() as $user_partner_relation)
  {
   $user_partner_relation->delete();
  }
 }
 return $this->getObject();
}

Проверьте имя метода "getUserPartners", которое должно быть объявлено в BaseUser.class.php (lib / model / om / BaseUser.class.php)

0 голосов
/ 05 мая 2011

Дело в том, что ваше второе решение, т.е. цикл по связанным объектам и вызов удаления () для них должны работать. Это документированный способ работы (см .: http://www.symfony -project.org / book / 1_0 / 08-Inside-the-Model-Layer # chapter_08_sub_saving_and_deleting_data ).

Но вместо того, чтобы бомбить БД с помощью запросов на удаление, вы также можете удалить их за один раз, добавив метод в класс Peer, который выполняет удаление, используя простой запрос к БД.

0 голосов
/ 29 апреля 2011
UserPartnerQuery::create()->filterByUser( $userObject )->delete();

или

UserPartnerQuery::create()->filterByUser( $partnerObject )->delete();

Была такая же проблема. Это рабочее решение.

0 голосов
/ 28 апреля 2011

Если вы изучаете Symfony, я предлагаю вам использовать Doctrine вместо Propel, потому что, я думаю, Doctrine проще и красивее, чем Propel.,Если бы я был вами, я сохраню свою функцию save() Я напишу другую функцию в моей модели1008 * Но я не понимаю, что это за атрибут StringProperty ...

...