Я столкнулся с проблемой сохранения данных отношений 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(),
]);
}
Моя проблема в том, что я не могу сохранить данные в базу данных, которую я пробовал с помощью циклов, но не смог. Класс Item является одним целым с Size. Какой товар имеет соответствующие размеры (s, m, l, xl, xxl). Чего я хочу добиться здесь, так это того, что когда я нажимаю кнопку «Сохранить», элемент и таблица размеров должны быть заполнены. Пожалуйста, помогите мне..
Просто чтобы продолжить то, что предложил @fjplaurr, используйте ссылку «Изменить» в левом нижнем углу вашего вопроса и избавьтесь от опубликованного кода, за исключением вещей, связанных с размером. Поскольку вопрос в настоящее время стоит, слишком много неуместного шума, чтобы пробираться. Я подозреваю, что Size::setItem никогда не вызывается, но это всего лишь предположение, и мне лень копировать/вставлять ваш код в IDE для проверки.




Вы пытаетесь сохранить отношение с обратной стороны (той, у которой есть mappedBy). Доктрина не будет проверять отношение при сохранении обратной стороны. В этом конкретном случае, я думаю, вы перепутали владеющие/обратные стороны. Я бы попытался поместить inversedBy в ваш класс Item, а mappedBy в класс Size.
Если вы хотите сохранить отношения как есть. Вам нужно будет установить свойство на стороне-владельце при установке свойства на обратной стороне.
Добро пожаловать в Stack Overflow. Обращаясь за помощью в отладке, мы просим вас сократить свой код, сделав минимально воспроизводимый пример. Это полезно для людей, чтобы понять вашу проблему, не просматривая весь код.