Symfony 2: постоянная сущность с отношениями один-ко-многим

У меня есть сущность Project, которая связана с некоторыми файлами через отношения один ко многим, например:

class projects{
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;

/**
* @ORM\OneToMany(targetEntity="files", mappedBy="project", cascade= {"persist","merge","remove"},orphanRemoval=true)
*/
protected $project_files;
}

И файл сущности:

class files{

private $files;

/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;

/**
* @ORM\ManyToOne(targetEntity="projects", inversedBy="project_files")
*/
protected $project;
}

Поэтому, когда я редактирую проект, я хочу иметь возможность добавлять в него новые файлы или удалять старые. Я нашел обходной путь для реализации этого, но я не могу понять, как Symfony и Doctrine действительно справляются с такими операциями. Точнее, мой код (который отлично работает), который обрабатывает удаление некоторых старых файлов при редактировании:

private function persistProject(Form $form) {
$project = $form->getData();
$raw_files = $project->getProjectFiles()->toArray();
$ready_files = self::setUpFiles($raw_files, $project);
$project->setProjectFiles($ready_files);
$em->merge($project);
$em->flush();
}

private function setUpFiles($project_files, $project) {
$ready_files = new ArrayCollection();
foreach ($project_files as $project_file){
if ((!empty($project_file->getId())) && ($project_file->getDescription() != '--del')){
$ready_files->add($project_file);
}
else if ((!empty($project_file->getId())) && ($project_file->getDescription() == '--del')){
unlink($this->uploadDir . $project_file->getPath());
// --- controversial line of code --- //
$project->removeProjectFile($project_file);
}
}
return $ready_files;
}

Итак, вкратце ситуация примерно такая: если я удаляю строку «$ project-> removeProjectFile ($ project_file);», файлы не удаляются, даже если мой ArrayCollection $ ready_files, который в конечном итоге сохраняется в объекте в строке «$ project-> setProjectFiles ($ ready_files); «, именно так и должно быть и не содержит удаленных файлов.

Так что мой вопрос двойной:

  1. Разве Symfony не должен сохранять точную коллекцию ArrayCollection (и только эту), которую я установил и удалил все остальные сохраненные файлы? Почему код не работает должным образом без строки «$ project-> removeProjectFile ($ project_file);»?

  2. Как работает строка «$ project-> removeProjectFile ($ project_file);» влияет на объект $ project в функции persistProject (), поскольку объект передается как простой аргумент, а не как ссылка? Разве не очевидно ожидать, что все, что происходит с объектом $ project в функции setUpFiles (), ничего не будет делать с исходным $ project в функции persistProject (), поскольку оно находится в другой области видимости?

Может кто-нибудь помочь мне прояснить это?

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]