Я совершенно новичок в 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» с сообщением «В связи, которая не была настроена для каскадных операций сохранения, обнаружен новый объект: @.Явно сохраняйте новый объект или настраивайте каскадные сохраняющиеся операции в отношении. '