Изменение коллекций Doctrine не влияет на таблицы базы данных. - PullRequest
2 голосов
/ 05 февраля 2011

Я совершенно новичок в Doctrine 2 (и в ORM тоже), и у меня проблема с обновлением коллекций.Я чувствую, что это типичный вопрос noob.

Мне нужны клиенты и хозяева.Каждый хост назначается какому-либо клиенту, и у каждого клиента может быть много хостов.Мои (упрощенные) классы:

/**
 * @Entity @Table(name="Customers")
 */
class Customer
{
    /** @Id @Column(type="integer") @GeneratedValue */
    private $id;

    /** @OneToMany(targetEntity="Host", mappedBy="cust_id") */
    private $hosts = null;

    public function __construct()
    {
      $this->hosts = new ArrayCollection();
    }

    public function addHost( $host )
    {
      $this->hosts[] = $host;
    }

    // plus getters/setters...
}

/**
 * @Entity @Table(name="Hosts")
 */
class Host
{
    /** @Id @Column(type="integer") @GeneratedValue */
    private $id;

    /** @ManyToOne(targetEntity="Customer", inversedBy="hosts") */
    private $cust_id;

    // plus getters/setters...
}

Мои таблицы базы данных (SQLite) следующие:

Клиенты: id, ...

Хосты: id, cust_id_id, ...

Я могу создать новых клиентов и хостов с помощью следующего кода:

$customer = new Customer();
$em->persist( $customer );
$em->flush();

Но когда я пытаюсь добавить хост к клиенту, с помощью этого кода:

$customer = ... // obtain a customer object - that works.
$host = ... // obtain a host object - that works.
$customer->addHost($host);
$em->persist($customer);
$em->flush();

ничего не происходит.Я имею в виду, что не вижу изменений в моей базе данных (cust_id_id для затронутого хоста все еще пуст).Я хотел бы добавить новый хост для некоторого потребителя и правильно установить столбец cust_id_id в таблице Hosts.

Что я делаю не так?


Обновление:

Я полагаю, что отношение OneToMany должно быть обратной стороной, поскольку объявление его в качестве стороны-владельца заставляет мою доктрину жаловаться на неизвестную опцию "inversedBy".Поэтому я решил оставить Customer в качестве обратной стороны, а Host - в качестве стороны-владельца и изменить метод Customer-> addHost следующим образом:

public function addHost( $host )
{
  $host->setCustomerId( $this->id );
  $this->hosts[] = $host;
}

Теперь, после вызова $ em-> flush () Я получаю следующую ошибку:

Неполученное исключение «InvalidArgumentException» с сообщением «В связи, которая не была настроена для каскадных операций сохранения, обнаружен новый объект: @.Явно сохраняйте новый объект или настраивайте каскадные сохраняющиеся операции в отношении. '

1 Ответ

2 голосов
/ 07 февраля 2011

Вы определили узлы Customer # в качестве обратной стороны. При сохранении данных в базе данных учитывается только сторона-владелец. См. Руководство по этому вопросу.

http://www.doctrine -project.org / документы / ОРМ / 2,0 / о / ссылка / ассоциация-mapping.html # владеющих-бок и-обратная сторона

В вашем случае, если вы хотите иметь Customer # addHosts вместо Host # addCustomer, вы должны переключить ключевые слова "mappedBy" и "inversedBy" на две сущности.

...