这是我的问题:我有 2 个名为“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;
我创建了一个整合品牌表单的元素表单:
// 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(如果存在“名称+模型”这对夫妇,则在品牌中搜索,如果是则返回此对象),但根据其他人的说法,这不是一个好的解决方案。
编辑
这是我使用的解决方案:
// 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
}
}