这是我的问题:我有两个名为“Brand”和“Element”的实体.每个元素都与一个独特的品牌相关. 品牌实体 /*** Brand** @ORM\Entity(repositoryClass="Acme\AcmeBundle\Entity\BrandRepository")*/class Brand{ /** * @
品牌实体
/** * 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); }