#orm #doctrine-orm #symfony #lazy-loading
#orm #доктрина-orm #symfony #отложенная загрузка
Вопрос:
Вот моя проблема: у меня есть 3 объекта Item, User и Link выше (у этих классов также есть обычные методы получения и установки).
class User {
//...
/*
* @ORMOneToMany(targetEntity="Link", mappedBy="user", cascade={"persist", "remove"})
*
*/
protected $links;
//...
}
class Item {
//...
/*
* @ORMOneToMany(targetEntity="Link", mappedBy="item", cascade={"persist", "remove"})
*
*/
protected $links;
//...
}
class Link {
/**
* @var datetime $time
*
* @ORMColumn(name="time", type="datetime")
*/
private $time;
/**
*
* @ORMId
* @ORMManyToOne(targetEntity="Item", inversedBy="links")
* @ORMJoinColumn(name="item_id", referencedColumnName="id")
*/
private $item;
/**
*
* @ORMId
* @ORMManyToOne(targetEntity="User", inversedBy="links")
* @ORMJoinColumn(name="user_id", referencedColumnName="id")
*/
private $user;
//...
}
Я не использовал отношение ManyToMany из-за свойства $ time в классе Link.
Когда я создаю ссылку, я делаю это таким образом :
$link = getExistingLink($item, $user);
if (!$link) {
$link = new Link();
$link->setItem($item);
$link->setUser($user);
}
$link->setTime(new DateTime());
$em = $this->getEntityManager();
$em->persist($link);
$em->flush();
Данные записываются в базу данных, однако, когда я вызываю $user-> getLinks(), он возвращает NULL. Я попытался это сделать :
$user->addLink($link);
$em->persist($user);
$em->flush();
Но ссылка не будет загружена при следующей загрузке $user.
Есть идеи, почему объекты ссылки не загружены?
Комментарии:
1. Я никогда не использовал аннотацию @ORM Id для отношения ManyToOne . Я думаю, что это только для идентификатора таблицы, а не для идентификаторов в целом. Вы пытались удалить его?
2. На самом деле я использовал @ORM Id для этих 2 свойств, потому что я хочу создать свой первичный ключ из этих 2 столбцов (как это было бы сделано в отношениях ManyToMany). Тем не менее, я попытался установить один столбец Id и все равно получил тот же результат.
Ответ №1:
ХОРОШО, проблема решена.
Аннотации начинаются с /* вместо /** как в классах User, так и в классах Item.
Просто глупая ошибка…