2017-03-28 37 views
11

我正忙於爲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')) 
    ; 
} 

我怎麼能做出這個動作儘可能簡單的事實,使確保只有獨特的商品被添加到父母的櫥櫃架子中。我不能改變屬性和類。我必須與此合作。我不想使用任何其他複雜的方式,例如創建任何偵聽器或其他功能。

我希望我已經很好地解釋了我的情況,希望有人能夠幫助我提供一些好的反饋意見。

回答

4

你是正確的,你可以修改Parent類的這樣的addChild功能:

/** 
    * Add child 
    * 
    * @param \AppBundle\Entity\Child $child 
    * 
    * @return Parent 
    */ 
    public function addChild(Child $child) 
    { 
     if (! is_array($this->childs) || ! in_array($child, $this->childs)) { 
      $this->childs[] = $child; 
      $child->setParent($this); 
     } 
     return $this; 
    } 

這個條件只是說,如果沒有孩子呢,加上孩子,或者如果孩子是不是已經在$this->childs數組中,然後添加它。

+1

就我所知in_array函數無法比較對象 – michelek

1

因爲你通過removeChild訪問$childs的學說集合:

/** 
* Remove child 
* 
* @param \AppBundle\Entity\Child $child 
*/ 
public function removeChild(\AppBundle\Entity\Child $child) 
{ 
    $this->childs->removeElement($child); 
} 

因此,在構造函數中,你應該首先初始化您的孩子收集。

public function __construct() 
{ 
    $this->childs = new ArrayCollection(); 
} 

爲避免重複的孩子,您需要在添加到收藏之前檢查現有的孩子。

/** 
* Add child 
* 
* @param \AppBundle\Entity\Child $child 
* 
* @return Parent 
*/ 
public function addChild(\AppBundle\Entity\Child $child) 
{ 
    if (!$this->childs->contains($child)) { 
     $this->childs->add($child); 
     $child->setParent($this); 
    } 

    return $this; 
} 
相關問題