当前位置 : 主页 > 网络推广 > seo >

symfony – 如果不存在则添加或在另一个实体中检索实体

来源:互联网 收集:自由互联 发布时间:2021-06-16
这是我的问题:我有两个名为“Brand”和“Element”的实体.每个元素都与一个独特的品牌相关. 品牌实体 /*** Brand** @ORM\Entity(repositoryClass="Acme\AcmeBundle\Entity\BrandRepository")*/class Brand{ /** * @
这是我的问题:我有两个名为“Brand”和“Element”的实体.每个元素都与一个独特的品牌相关.

品牌实体

/**
* Brand
*
* @ORM\Entity(repositoryClass="Acme\AcmeBundle\Entity\BrandRepository")
*/

class Brand
{
    /**
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\Column(name="name", type="string", length=255)
     */
    private $name;

    /**
     * @ORM\Column(name="model", type="string", length=255, nullable=true)
     */
    private $model;

元素实体

/**
 * Element
 *
 * @ORM\Entity(repositoryClass="Acme\AcmeBundle\Entity\ElementRepository")
 */

class Element
{
    /**
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\Column(name="serial", type="string", length=255)
     */
    private $serial;

    ... others properties ...

    /**
     * @ORM\ManyToOne(targetEntity="Brand", cascade={"persist"})
     * @ORM\JoinColumn(nullable=false)
     */
    private $brand;

我创建了一个整合了Brand形式的Element元素:

// src/Acme/AcmeBundle/Form/ElementType.php

/**
 * @param FormBuilderInterface $builder
 * @param array $options
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('brand', new BrandType())
        ->add('mac')
        ->add('ip')
    ;
}

它运作完美,但每个新元素都添加了一个新品牌,所以我可以在我的表格中复制(例如品牌2和4):

-+--------+----------+-------+
 | ID | name |      model    |
-+--------+----------+-------+
 | 1  | Dell |  Inspiron 14  |
-+--------+----------+-------+
 | 2  | Dell |  Inspiron 15  |
-+--------+----------+-------+
 | 3  | Acer |   Aspire E    |
-+--------+----------+-------+
 | 4  | Dell |  Inspiron 15  |
-+--------+----------+-------+
 | .  |  ..  |      ...      |
-+--------+----------+-------+

添加新元素时,如何检索注册品牌(并用它映射元素)而不是添加新品牌?

我想在PrePersist函数中调用EntityManager(在Brand中搜索,如果这对“名称模型”存在,并且如果是这种情况则返回此对象),但是根据其他人,这不是一个好的解决方案.

编辑

这是我使用的解决方案:

// src/Acme/AcmeBundle/Controller/AcmeController.php

public function createAction(Request $request)
{
    $entity = new Element();
    $form = $this->createForm(...);
    $form->handleRequest($request);

    if ($form->isValid()) {

        $brand = $this->getDoctrine()
               ->getRepository('AcmeAcmeBundle:Brand')
               ->findOneBy(array(
                   'name' => $entity->getBrand()->getName(),
                   'model' => $entity->getBrand()->getModel()
                ));
        if($brand)
            $entity->setBrand($brand);

        $em = $this->getDoctrine()->getManager();
        $em->persist($entity);
        $em->flush();

        // Redirect
    }
}
在保留任何实体之前,您可以将其触发为:

$entity = $em->getRepository('Brand')->findOneBy([
        'model' => $model, 
        'name' => $name
    ]);

    if ($entity == null)
    {
        //no brand found. So, persist the new one:
        ...
    }
    else
    {
        $element->setBrand($theNewBrand);
    }
网友评论