Intereting Posts
kohana 3.2 ORM find_all () с отношениями Как получить все опции супер атрибута для настраиваемого элемента в Magento Время создания файла Как я могу получить сообщения с изображениями из базы данных WordPress, если WordPress больше не установлен? Задать настраиваемый заголовок, а затем перенаправить CakePHP 2 не может найти плагин Загрузите doc, pdf, xls и т. Д. Из приложения android на php-сервер Как вызвать службу веб-сайта из PHP? Удалить расширение .php с помощью PHP Получить последнюю измененную дату удаленного файла Получите минимальное ID и максимальное значение ID в MySQL php Автоматическая отправка электронной почты по времени и адресу электронной почты в базе данных Условия для разбивки на страницы, принадлежащие ToMany CakePHP 3 Я хочу, чтобы мои пользователи имели доступ только к моим php-файлам, если они пытаются получить доступ к папкам, которые я хочу включить в свой файл 404 API-интерфейс SoftLayer Nessus Scan Status / Report через PHP

Поле, отображаемое в доктрине, не работает

У меня есть два объекта 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() .

Solutions Collecting From Web of "Поле, отображаемое в доктрине, не работает"

Я отчаянно пытался найти решение, когда вспомнил, что у Доктрины есть свой кеш, независимый от 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 

Аминь.