仅当子对象尚不存在时才将它们添加到父对象 [英] Add children objects to a parent only if they don't yet exist

查看:46
本文介绍了仅当子对象尚不存在时才将它们添加到父对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正忙着为父母开发一个动作,应该添加一些由用户输入给出的孩子。



这些孩子有3个属性,并将它们组合在一起,每个孩子都应该是独一无二的。



我使用Symfony和Doctrine,我的基本家长班看起来像这样:



I am busy developing an action for parent that should add a number of children given by the user input.

The children have 3 properties, and combining them, each child should always be unique.

I make use of Symfony and Doctrine and my basic parent class looks like this:

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





我的孩子班级看起来像这样(再次非常基本):





My child class look like this (again really basic):

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类中的addChild函数,但我不确定如何。



我尝试了什么: < br $>


我到目前为止尝试的是创建一个数组并根据橱柜和货架对所有项目进行分组,然后如果该项目中不存在该项目,则应创建该项目。



这是我的代码:





Then I have an action per parent object (kind of the same as an edit action) that has to create children for it. When I click the link (for the specific parent) a form is generated that has three input fields:

- Cupboard
- Shelf
- Number of items

The user then has to specify with integers how many items he wants to add in what cupboard and what shelf. If the item (integer) already exist in that given cupboard on that given shelf it should not make it again, but the first next available integer should be used for item.

How can I make this as simple as possible? I understand I can use the addChild function from the Parent class, but I'm not sure how.

What I have tried:

What I have tried so far is to create an array and group all items according to cupboard and shelf and then if the item does not exist in that array it should be created.

This is my code:

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





如需了解更多信息,请参阅我的表单构建器:





For extra information, this is how my form builder looks:

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





如何确保此操作尽可能简单,以确保只添加唯一项目父母在柜子里的架子。我不能改变属性和类。我必须这样做。我不想使用任何其他复杂的方式,如创建任何听众或其他直到功能。



我希望我已经很好地解释了我的情况,我希望有人可以提供帮助我有一些很好的反馈。



How can I make this action as simple as possible with the fact to make sure only unique items is added to a shelf in a cupboard for the parent. I can't change the properties nor the classes. I have to work with this. I don' want to use any other complex way like creating any listeners or other until functions.

I hope I've explained my situation well and I hope somebody can help me with some good feedback.

推荐答案

childs ;

/ * *
*添加孩子
*
* @param \ AppBundle\Entity\Child
childs; /** * Add child * * @param \AppBundle\Entity\Child


child
*
* @return Parent
* /
public function addChild(\ AppBundle \ Entity \Child
child * * @return Parent */ public function addChild(\AppBundle\Entity\Child


child)
{
child) {


这篇关于仅当子对象尚不存在时才将它们添加到父对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆