如何在 Symfony 中保存 OneToMany 关系数据?
How to persist OneToMany Relationship data in Symfony?
我在将 OneToMany 关系数据保存到数据库时遇到了问题。
以下是代码:
项目类型
->add('title')
->add('image',FileType::class)
->add('size', CollectionType::class,[
'entry_type'=> SizeType::class,
'entry_options' => ['label' => false],
'by_reference' => false,
'allow_add' =>true,
'allow_delete' => true
])
->add('content',CKEditorType::class)
->add('save', SubmitType::class);
项目实体
class Item
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=255)
*/
private $title;
/**
* @ORM\OneToMany(targetEntity=Size::class, mappedBy="size",cascade={"persist"})
*/
private $size;
public function __construct()
{
$this->size = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
/**
* @return Collection|Size[]
*/
public function getSize(): Collection
{
return $this->size;
}
public function addSize(Size $size): self
{
if (!$this->size->contains($size)) {
$this->size[] = $size;
$size->setSize($this);
}
return $this;
}
public function removeSize(Size $size): self
{
if ($this->size->removeElement($size)) {
// set the owning side to null (unless already changed)
if ($size->getSize() === $this) {
$size->setSize(null);
}
}
return $this;
}
}
大小实体
class Size
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity=Item::class, inversedBy="size", fetch="EAGER")
*/
private $size;
public function getSize(): ?Item
{
return $this->size;
}
public function setSize(?Item $size): self
{
$this->size = $size;
return $this;
}
}
控制器
/**
* @Route("/admin/post-product", name="post_product")
*/
public function postProduct(Request $request, SluggerInterface $slugger): Response
{
$item = new Item();
$size = new Size();
$form = $this->createForm(ItemType::class, $item);
$form->handleRequest($request);
if($form->isSubmitted()){
$file_image = $form->get('image')->getData();
dump($item->getSize());
//die;
if($file_image){
//image
}
$sizes = $item->getSize();
$item->addSize($sizes);
$em = $this->getDoctrine()->getManager();
$em->persist($item);
$em->flush();
return $this->redirectToRoute('post_product');
}
return $this->render('admin/post-product.html.twig',[
'form' => $form->createView(),
]);
}
我的问题是我无法将数据保存到数据库中 我试过使用循环,但我做不到。
class Item 是 onetomany with Size。
哪个项目具有相关尺寸(s、m、l、xl、xxl)。
我想在这里实现的是,当我单击保存按钮时,必须填充项目和大小 table。
请帮帮我..
您正在尝试从相反的一侧(具有 mappedBy 的一侧)保持关系。坚持相反的一面时,学说不会检查关系。在这种特殊情况下,我认为您混淆了 owning/inverse 方面。我会尝试将 inversedBy
放入您的 Item
class 并将 mappedBy
放入 Size
class.
你是否想保持这种关系。在反面设置 属性 时,您必须在拥有方设置 属性。
我在将 OneToMany 关系数据保存到数据库时遇到了问题。 以下是代码:
项目类型
->add('title')
->add('image',FileType::class)
->add('size', CollectionType::class,[
'entry_type'=> SizeType::class,
'entry_options' => ['label' => false],
'by_reference' => false,
'allow_add' =>true,
'allow_delete' => true
])
->add('content',CKEditorType::class)
->add('save', SubmitType::class);
项目实体
class Item
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=255)
*/
private $title;
/**
* @ORM\OneToMany(targetEntity=Size::class, mappedBy="size",cascade={"persist"})
*/
private $size;
public function __construct()
{
$this->size = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
/**
* @return Collection|Size[]
*/
public function getSize(): Collection
{
return $this->size;
}
public function addSize(Size $size): self
{
if (!$this->size->contains($size)) {
$this->size[] = $size;
$size->setSize($this);
}
return $this;
}
public function removeSize(Size $size): self
{
if ($this->size->removeElement($size)) {
// set the owning side to null (unless already changed)
if ($size->getSize() === $this) {
$size->setSize(null);
}
}
return $this;
}
}
大小实体
class Size
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity=Item::class, inversedBy="size", fetch="EAGER")
*/
private $size;
public function getSize(): ?Item
{
return $this->size;
}
public function setSize(?Item $size): self
{
$this->size = $size;
return $this;
}
}
控制器
/**
* @Route("/admin/post-product", name="post_product")
*/
public function postProduct(Request $request, SluggerInterface $slugger): Response
{
$item = new Item();
$size = new Size();
$form = $this->createForm(ItemType::class, $item);
$form->handleRequest($request);
if($form->isSubmitted()){
$file_image = $form->get('image')->getData();
dump($item->getSize());
//die;
if($file_image){
//image
}
$sizes = $item->getSize();
$item->addSize($sizes);
$em = $this->getDoctrine()->getManager();
$em->persist($item);
$em->flush();
return $this->redirectToRoute('post_product');
}
return $this->render('admin/post-product.html.twig',[
'form' => $form->createView(),
]);
}
我的问题是我无法将数据保存到数据库中 我试过使用循环,但我做不到。 class Item 是 onetomany with Size。 哪个项目具有相关尺寸(s、m、l、xl、xxl)。 我想在这里实现的是,当我单击保存按钮时,必须填充项目和大小 table。 请帮帮我..
您正在尝试从相反的一侧(具有 mappedBy 的一侧)保持关系。坚持相反的一面时,学说不会检查关系。在这种特殊情况下,我认为您混淆了 owning/inverse 方面。我会尝试将 inversedBy
放入您的 Item
class 并将 mappedBy
放入 Size
class.
你是否想保持这种关系。在反面设置 属性 时,您必须在拥有方设置 属性。