У меня есть Project
и Files
. Один проект может иметь несколько файлов, а один файл принадлежит только одному проекту. Вот как мои отношения сделаны
В сущности Files
/** * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Project", inversedBy="files") * @ORM\JoinColumn(name="project_id", referencedColumnName="id") */ private $project;
В объекте Project
:
/** * @var ArrayCollection * @ORM\OneToMany(targetEntity="AppBundle\Entity\Files", mappedBy="project") */ private $files;
Вот как создается новый файл после его загрузки
public function createFile($fileName,$project,User $user){ $file = new Files(); $file->setFilePath($this->targetDirectory."/".$fileName); $file->setFromUser($user->getType()); $file->setProject($project); $file->setDate(new \DateTime()); dump($file); $this->entityManager->persist($file); $this->entityManager->flush(); }
Эта функция вызывается в ProjectController
после очистки проекта (который дает ему ID, который затем я могу использовать для создания моего файла). Вот код
$projectService->createProject($project, $user, $isWithoutTerm, self::NO_TERM_DEFAULT_VALUE); $filesService = $this->get('app.service.files_service'); foreach ($managerFiles as $managerFile) { $fileName = $filesService->uploadFileAndReturnName($managerFile,$this->getParameter('files_directory')); $filesService->createFile($fileName, $project, $user); }
После того, как все установлено и выполнено, у меня есть проект и файлы. В таблице файлов я вижу, что project_id
имеет идентификатор созданного проекта. Затем я пытаюсь получить из проекта все файлы, используя свойство files
. В моем контроллере у меня есть dump(project->getFiles());
который до сих пор возвращает это
Несмотря на то, что у меня в файлах базы данных, у которых есть идентификатор проекта, мои files
не заполнены файлами. Я полагаю, что моя ошибка в аннотациях, но я понятия не имею, как это исправить.
Отношения (по умолчанию) загружаются ленивыми в Doctrine. Значение: оно не извлекается из базы данных, пока вы не получите доступ к ней.
Попытайтесь пройти через getFiles. Вы увидите, что вы можете получить к ним доступ.
В чем разница между fetch = "EAGER" и fetch = "LAZY" в доктрине, включая дальнейшие ссылки в этом Top Answer to Doctrine, чтобы объяснить это дальше.