Symfony 两个实体之间的多重关系不';不行?

Symfony 两个实体之间的多重关系不';不行?,symfony,Symfony,我在两个实体“用户”和“文件管理器”之间有多重关系 一个用户可以有许多文件 一个用户只能有一个化身 我是这样处理这种关系的: class Users extends BaseUser { /** * @var File * @ORM\ManyToOne(targetEntity="App\Entity\File",cascade={"persist"}) * @Assert\Valid() */ private $avatar; /**

我在两个实体“用户”和“文件管理器”之间有多重关系

一个用户可以有许多文件

一个用户只能有一个化身

我是这样处理这种关系的:

class Users extends BaseUser
{
/**
     * @var File
     * @ORM\ManyToOne(targetEntity="App\Entity\File",cascade={"persist"})
     * @Assert\Valid()
     */
    private $avatar;


    /**
     * @var ArrayCollection
     * @ORM\OneToMany(targetEntity="App\Entity\File",mappedBy="user",cascade={"persist"})
     */
    private $files;

 public function __construct()
    {
        $this->sessions = new ArrayCollection();
        $this->departments = new ArrayCollection();
        $this->jobTitles = new ArrayCollection();
        $this->sessionMessages = new ArrayCollection();
        $this->files = new ArrayCollection();
        parent::__construct();
    }


 /**
     * @return File
     */
    public function getAvatar()
    {
        return $this->avatar;
    }
 /**
     * @param File $avatar
     */
    public function setAvatar(File $avatar=null)
    {
        $this->avatar = $avatar->getId();
        $avatar->setUser($this);
    }

    /**
     * @return Collection|File[]
     */
    public function getFiles()
    {
        return $this->files;
    }

    public function addFile(File $file)
    {
        if (!$this->files->contains($file) && !is_null($file)) {
            $this->files[] = $file;
            $file->setUser($this);
        }

        return $this;
    }

    public function removeFile(File $file)
    {
        if ($this->files->contains($file)) {
            $this->files->removeElement($file);
            // set the owning side to null (unless already changed)
            if ($file->getUser() === $this) {
                $file->setUser(null);
            }
        }

        return $this;
    }


}
public function setAvatar(File $avatar=null)
    {
        $this->avatar = $avatar->getId();
        $avatar->setUser($this);
    }
这是我的文件实体

class File
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="boolean",nullable=true)
     *
     */
    private $status;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $name;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $path;

    /**
     * @var Users
     * @ORM\ManyToOne(targetEntity="App\Entity\Users",inversedBy="files")
     */
    private $user;

    /**
     *@Assert\File()
     */
    private $file;

    /**
     * Sets file.
     *
     * @param UploadedFile $file
     */
    public function setFile(UploadedFile $file = null)
    {
        $this->file = $file;
    }

    /**
     * Get file.
     *
     * @return UploadedFile
     */
    public function getFile()
    {
        return $this->file;
    }

    public function getId()
    {
        return $this->id;
    }

    public function getStatus(): ?bool
    {
        return $this->status;
    }

    public function setStatus(bool $status): self
    {
        $this->status = $status;

        return $this;
    }

    public function getName(): ?string
    {
        return $this->name;
    }

    public function setName(string $name): self
    {
        $this->name = $name;

        return $this;
    }

    public function getPath(): ?string
    {
        return $this->path;
    }

    public function setPath(string $path): self
    {
        $this->path = $path;

        return $this;
    }

    public function getUser(): ?Users
    {
        return $this->user;
    }

    public function setUser($user)
    {if (!is_null($this->file)){
        $this->user = $user;
    }


        return $this;
    }
}
问题是当我提交我的注册表格时,我有一个错误,说文件不能上传。我想这是因为我的表格类型是这样的:

class RegistrationType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
 ->add('avatar', FileManagerType::class,[
                'data_class'=>File::class,
                'by_reference'=>false
            ])
            ->add('files', CollectionType::class,[
                "entry_type"=> UserFileManagerType::class,
                "allow_add" => true,
                "allow_delete"=>true
            ])

. . .

但事实并非如此,问题在于提交后化身文件类型的id为空,因此无法上传。

检查我的代码和symfony文档后,我终于意识到可以通过如下更改我的用户类来修复此问题:

class Users extends BaseUser
{
/**
     * @var File
     * @ORM\ManyToOne(targetEntity="App\Entity\File",cascade={"persist"})
     * @Assert\Valid()
     */
    private $avatar;


    /**
     * @var ArrayCollection
     * @ORM\OneToMany(targetEntity="App\Entity\File",mappedBy="user",cascade={"persist"})
     */
    private $files;

 public function __construct()
    {
        $this->sessions = new ArrayCollection();
        $this->departments = new ArrayCollection();
        $this->jobTitles = new ArrayCollection();
        $this->sessionMessages = new ArrayCollection();
        $this->files = new ArrayCollection();
        parent::__construct();
    }


 /**
     * @return File
     */
    public function getAvatar()
    {
        return $this->avatar;
    }
 /**
     * @param File $avatar
     */
    public function setAvatar(File $avatar=null)
    {
        $this->avatar = $avatar->getId();
        $avatar->setUser($this);
    }

    /**
     * @return Collection|File[]
     */
    public function getFiles()
    {
        return $this->files;
    }

    public function addFile(File $file)
    {
        if (!$this->files->contains($file) && !is_null($file)) {
            $this->files[] = $file;
            $file->setUser($this);
        }

        return $this;
    }

    public function removeFile(File $file)
    {
        if ($this->files->contains($file)) {
            $this->files->removeElement($file);
            // set the owning side to null (unless already changed)
            if ($file->getUser() === $this) {
                $file->setUser(null);
            }
        }

        return $this;
    }


}
public function setAvatar(File $avatar=null)
    {
        $this->avatar = $avatar->getId();
        $avatar->setUser($this);
    }
正如你所看到的,这很容易,但花了我很多时间,我希望它能帮助其他人

更新 我在代码中发现了另一个导致文件错误的问题, 由于某种原因,我的文件名无效,因此移动函数返回false,因此我将其替换为follow,它可以正常工作

$fileName = $files->getFilename().'.'.$files->guessExtension();
 $result= $files->move($this->resumePath,$fileName);