У меня есть два объекта User\User
и Misc\Notification
и я хочу иметь возможность получать уведомления пользователя внутри объекта User, выполняя $user->getNotifications()
. Обычно у меня нет проблем с этим типом отношений.
См. Мой код ниже (я просто добавил отношение TicketApp в качестве примера, так как это отношение работает и точно такое же):
User\User : properties
/** * This is working * @ORM\OneToMany(targetEntity="[...]\Entity\Ticket\TicketApp", mappedBy="author") */ private $tickets; /** * This is not * @ORM\OneToMany(targetEntity="[...]\Entity\Misc\Notification", mappedBy="receiver", fetch="EXTRA_LAZY") */ private $notifications;
User\User : __construct()
$this->tickets = new \Doctrine\Common\Collections\ArrayCollection(); $this->notifications = new \Doctrine\Common\Collections\ArrayCollection();
Misc\Notification : properties
/** * @ORM\ManyToOne(targetEntity="[...]\Entity\User\User", inversedBy="notifications") * @ORM\JoinColumn(nullable=false) */ private $receiver;
Кажется, это хорошо (или, может быть, сегодня вечером я полностью слеп). Проблема заключается в следующем: $user->getNotifications()
возвращает null
вместо объекта Doctrine Collection
. У меня есть данные в моем столе. Этот тип кода работает и возвращает два уведомления:
$em->getRepository('[...]:Misc\Notification')->findByReceiver($user);
Кроме того, я заметил в панели инструментов отладки Symfony, что при использовании $user->getNotifications()
.
Я отчаянно пытался найти решение, когда вспомнил, что у Доктрины есть свой кеш, независимый от Symfony (я пробовал десятки cache:clear
без каких-либо изменений). Я думал, что моя проблема может быть проблемой кэша Doctrine, поэтому я попытался очистить кеш:
app/console doctrine:cache:clear-metadata
(Если вы используете автономную Doctrine, эта команда имеет эквивалент в чистой доктрине, Symfony просто переименовывает и улучшает команды Doctrine).
Если у вас нормальная установка, это должно работать, в противном случае продолжить чтение.
В обычное время, по крайней мере, в режиме dev, Doctrine восстанавливает кеш метаданных при каждом запросе. Но Doctrine также имеет интерфейс APC для хранения своего кеша … Я активировал его две или три недели назад, и я полностью его забыл. Когда я выполнил команду выше, Доктрина сказала:
Cannot clear APC Cache from Console, its shared in the Webserver memory and not accessible from the CLI.
Сейчас проблема ясна. Doctrine заполняет кеш и не может правильно удалить данные. Метод getNotifications
возвращал значение null
потому что это был чистый PHP, но Doctrine не знал, что свойство notifications
было отображено SQL. Поэтому поле никогда не было инициализировано. Если вы используете другого cacher, это, вероятно, аналогичная проблема.
Указанная выше ошибка является самоочевидной. Вам нужно очистить хранилище APC. Поскольку он размещен в процессе веб-сервера, просто перезагрузите этого парня:
sudo service apache2 restart
Аминь.