我正忙於爲parent
開發一項操作,該操作應添加由用戶輸入提供的多個孩子。只有在父母不存在的情況下才能將子對象添加到家長
孩子們有3個屬性,並結合他們,每個孩子應該永遠是獨一無二的。
我使用Symfony和教義和我的基本父類的看起來是這樣的:
class Parent
{
/**
* @var Child[]|ArrayCollection
*
* @ORM\OneToMany(targetEntity="Child", mappedBy="parent")
* @ORM\OrderBy({"dateCreated": "DESC"})
*/
private $childs;
/**
* Add child
*
* @param \AppBundle\Entity\Child $child
*
* @return Parent
*/
public function addChild(\AppBundle\Entity\Child $child)
{
$this->childs[] = $child;
$child->setParent($this);
return $this;
}
/**
* Remove child
*
* @param \AppBundle\Entity\Child $child
*/
public function removeChild(\AppBundle\Entity\Child $child)
{
$this->childs->removeElement($child);
}
/**
* Get childs
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getChilds()
{
return $this->childs;
}
}
我的孩子上課這個樣子的(再次非常基本的):
class Child
{
/**
* @var int
*
* @ORM\Column(name="cupboard", type="integer")
*/
private $cupboard;
/**
* @var int
*
* @ORM\Column(name="shelf", type="integer")
*/
private $shelf;
/**
* @var int
*
* @ORM\Column(name="item", type="integer")
*/
private $item;
/**
* @var Parent
*
* @ORM\ManyToOne(targetEntity="Parent", inversedBy="childs")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="parent_id", referencedColumnName="id")
* })
*/
private $parent;
/**
* Set cupboard
*
* @param string $cupboard
*
* @return Child
*/
public function setCupboard($cupboard)
{
$this->cupboard = $cupboard;
return $this;
}
/**
* Get cupboard
*
* @return int
*/
public function getCupboard()
{
return $this->cupboard;
}
/**
* Set shelf
*
* @param string $shelf
*
* @return Child
*/
public function setShelf($shelf)
{
$this->shelf = $shelf;
return $this;
}
/**
* Get shelf
*
* @return int
*/
public function getShelf()
{
return $this->shelf;
}
/**
* Set item
*
* @param string $item
*
* @return Child
*/
public function setItem($item)
{
$this->item = $item;
return $this;
}
/**
* Get item
*
* @return int
*/
public function getItem()
{
return $this->item;
}
/**
* Set parent
*
* @param Parent $parent
*
* @return Child
*/
public function setParent(Parent $parent)
{
$this->parent = $parent;
return $this;
}
/**
* Get parent
*
* @return Parent
*/
public function getParent()
{
return $this->parent;
}
}
然後,我有一個每parent
對象的動作(與編輯動作相同)必須爲其創建子對象。當我點擊鏈接(在特定父)產生一個形式,它有三個輸入字段:
- 櫥櫃
- 保質
- 項目數
然後,用戶可以指定整數多少物品他想要添加在什麼櫥櫃和什麼架子上。如果該項目(整數)已經存在於給定貨架上的給定櫥櫃中,則它不應該重新生成,但是應該爲項目使用第一個下一個可用整數。
我該如何儘可能簡化?我知道我可以使用Parent
類中的addChild
函數,但我不知道如何。
我到目前爲止所嘗試的是創建一個數組,並根據櫥櫃和貨架分組所有項目,然後如果該項目不存在於該數組中,則應該創建它。
這是我的代碼:
public function addItemAction(Request $request, $id = null){
$parent = $this->admin->getSubject();
if (!$parent) {
throw new NotFoundHttpException(sprintf('Unable to find the object with id: %s', $id));
}
$em = $this->getDoctrine()->getManager();
$form = $this->createForm(AddItemType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$kids = $popUnit->getChilds();
$formParams = $request->request->get('add_item');
$units = array();
foreach ($kids as $kid) {
$units[$kid->getCupboard()][$kid->getShelf()][$kid->getItem()] = $kid->getItem();
}
$givenShelf = $units[$formParams['cupboard']][$formParams['shelf']];
for ($i = 1; $i <= $formParams['itemAmount']; $i++) {
if (!in_array($i, $givenShelf)) {
$child = new Child();
$child->setParent($parent);
$child->setCupboard($formParams['cupboard']);
$child->setShelf($formParams['shelf']);
$child->setItem($i);
$em->persist($child);
$em->flush();
}
}
return new RedirectResponse($this->admin->generateUrl('show', array('id' => $parent->getId())));
}
return $this->render('AppBundle:Parent:add_childs.html.twig', array(
'form' => $form->createView(),
'parent' =>$parent,
));
}
對於額外的信息,這是我的表單生成器的外觀:
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder
->add('cupboard', NumberType::class)
->add('shelf', NumberType::class)
->add('itemAmount', NumberType::class, array('label' => 'Number of Items'))
;
}
我怎麼能做出這個動作儘可能簡單的事實,使確保只有獨特的商品被添加到父母的櫥櫃架子中。我不能改變屬性和類。我必須與此合作。我不想使用任何其他複雜的方式,例如創建任何偵聽器或其他功能。
我希望我已經很好地解釋了我的情況,希望有人能夠幫助我提供一些好的反饋意見。
就我所知in_array函數無法比較對象 – michelek