2016-07-29 17 views
0

a problem I had with variations of entitiesを回避するために、デバイスの修理に使用できる色の数を制限しようとしています。使用可能な色は、デバイスで使用可能な色を超えてはいけません。Symfony/Doctrine:結合テーブルへのアクセス?

だから私は持っている:

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

これは、デバイスにも色に修理の仕事をマッピングします。 Colorエンティティで使用できる色に「色」は、このフィールドをマップするが、Device

のこのインスタンスのために利用可能であるものにこれらの選択肢を制限する:ここ

/** 
* @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

ポイントにあります

->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クエリのdirectlサーバーのy:

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

ただし、上記の修復方法での試みでは、同じ結果が得られません。私はいつも、Deviceに設定されたものだけでなく、すべての色を利用できます。私は間違って何をしていますか?

答えて

0

解決策が見つかりました。まず、Colorエンティティにプロパティdevicesrepairsを追加することにより、色と修復の間、色とデバイス間のManyToMany関係を双方向に作成しました。

次は、私のような私のquery_builder属性を書いた:

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

微っぽい働くことになったこと。しかし、それは私が持っていた問題のための汚れたハックのように感じる。

関連する問題