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);