为了规避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
上设置的颜色。我做错了什么?
答案 0 :(得分:0)
我找到了解决方案。首先,我通过将属性devices
和repairs
添加到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);
}
最终工作得很好。但对于我遇到的问题,感觉就像是一个肮脏的黑客。