Symfony / Doctrine:访问连接表?

时间:2016-07-29 00:06:56

标签: doctrine-orm symfony

为了规避a problem I had with variations of entities肮脏的方式,我试图限制可用于设备修复的颜色数量。可用颜色不得超过设备可用的颜色。

所以我有:

Device.php

这会将设备映射到此设备可用的颜色和修复。

/**
 * @ORM\OneToMany(targetEntity="Repair", mappedBy="device", cascade={"remove"})
 */
private $repairs;

/**
 * @ORM\ManyToMany(targetEntity="Color", inversedBy="devices")
 * @ORM\JoinTable(name="devices_colors",
 *      joinColumns={@ORM\JoinColumn(name="device_id", referencedColumnName="id")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="color_id", referencedColumnName="id")}
 *      ) 
 */
private $colors;

Color.php

/**
 * @ORM\ManyToMany(targetEntity="Device", mappedBy="colors")
 */
private $devices;

Repair.php

这会将修复作业映射到设备,但也会映射到颜色。

/**
 * @ORM\ManyToOne(targetEntity="Device", inversedBy="repairs")
 * @ORM\JoinColumn(name="device_id", referencedColumnName="id")
 */
private $device;

/**
 * @ORM\ManyToMany(targetEntity="Color")
 * @ORM\JoinTable(name="repairs_colors",
 *      joinColumns={@ORM\JoinColumn(name="repair_id", referencedColumnName="id")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="color_id", referencedColumnName="id")}
 *      ) 
 */
private $colors;

RepairType.php

点这里是: 绘制此字段'颜色'到Color实体中可用的颜色,但将这些选项限制为此Device

实例的可用选项
   ->add('colors', EntityType::class, array(
              'label'=>'Kleuren',
              'class'=>'AppBundle:Color',
              'choice_label'=>'name',
              'choice_value'=>'id',
              'multiple'=>true,
              'expanded'=>true,
              'query_builder'=>function (EntityRepository $er) use ($device) {
                          return $er->createQueryBuilder('c')
                                ->join('AppBundle:Device','d')
                                ->where('d.id = :device')
                                ->setParameter('device', $device);
                    }
              )
        )

因为我知道创建了devices_colors连接表,所以我可以通过以下MySQL查询直接在服务器上实现所需的结果:

SELECT c.name FROM colors c LEFT JOIN devices_colors d ON (d.color_id=c.id) WHERE d.device_id = 1

但是,我在RepairType上面的尝试没有达到相同的效果。我总是得到所有可用的颜色,而不仅仅是Device上设置的颜色。我做错了什么?

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。首先,我通过将属性devicesrepairs添加到Color实体,使ManyToMany关系(颜色和修复之间以及颜色和设备之间)双向关系。

接下来,我写了我的query_builder属性:

              'query_builder'=>function (EntityRepository $er) use ($device) {
                          return $er->createQueryBuilder('c')
                                ->join('c.devices','d','WITH','d = :device')
                                ->setParameter('device', $device);
                    }

最终工作得很好。但对于我遇到的问题,感觉就像是一个肮脏的黑客。