我有一个通过一对多关系与某些文件相关的实体项目,如下所示:
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);",完全是应该的,并且不包含已删除的文件。
所以我的问题是双重的:
symfony是否应该保留我设置并删除存储的所有其他文件的确切ArrayCollection(并且只有这个)?如果没有行" $ project-> removeProjectFile($ project_file);"?
该行" $ project-> removeProjectFile($ project_file);"影响函数persistProject()中的$ project对象,因为对象是作为简单参数而不是通过引用传递的?很明显,期望函数setUpFiles()中$ project对象发生的一切都不会对函数persistProject()中的原始$项目做任何事情,因为它在不同的范围内?
任何人都可以帮我解决这个问题吗?