Symfony 2:持有一对多关系的实体

时间:2016-03-29 09:58:39

标签: php symfony doctrine one-to-many arraycollection

我有一个通过一对多关系与某些文件相关的实体项目,如下所示:

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. ,为什么代码不能正常工作?
  3. 该行" $ project-> removeProjectFile($ project_file);"影响函数persistProject()中的$ project对象,因为对象是作为简单参数而不是通过引用传递的?很明显,期望函数setUpFiles()中$ project对象发生的一切都不会对函数persistProject()中的原始$项目做任何事情,因为它在不同的范围内?

  4. 任何人都可以帮我解决这个问题吗?

0 个答案:

没有答案