に「クラス表の継承」を使用して教義と結合が多すぎる:私はsymfonyのとDoctrineで働いていると私は、次のエラーになってしまったsymfonyプロジェクト
SQLSTATE[HY000]: General error: 1116 Too many tables; MySQL can only use 61 tables in a join`
メインエンティティ(の一番上のテーブル階層)には61以上のエンティティの識別器マップが含まれています。 「多対多」の関連付けがそれ自体で行われるため、エンティティは親または子として他の人とリンクすることができます。ここで
エンティティDoctrineの注釈です:私は(さえtopclass「エンティティ」を拡張しない)いくつかの古典的なエンティティのリストを取得するにformTypeにクエリビルダを使用するたびに
/**
* Entity
*
* @ORM\Table(name="entity")
* @ORM\Entity(repositoryClass="Acme\EntityBundle\Repository\EntityRepository")
* @InheritanceType("JOINED")
* @DiscriminatorColumn(name="type", type="string")
* @DiscriminatorMap({
* "sub_entity_1" = "\Acme\SubEntityABundle\Entity\E1",
* "sub_entity_2" = "\Acme\SubEntityABundle\Entity\E2",
* ...
* })
*/
class Entity
{
/**
* @ORM\ManyToMany(targetEntity="Entity", inversedBy="parentEntities")
* @ORM\JoinTable(name="rel_entity_entity",
* joinColumns={@ORM\JoinColumn(name="parent", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="child", referencedColumnName="id")}
*)
*/
private $childrenEntities;
/**
* @ORM\ManyToMany(targetEntity="Entity", mappedBy="childrenEntities")
*
*/
private $parentEntities;
/**
* Get children entities
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getChildrenEntities()
{
return $this->childrenEntities;
}
/**
* Set childrenEntities
*
* @param ArrayCollection $entities
*/
public function setchildrenEntities(ArrayCollection $entities)
{
$this->childrenEntities = $entities;
}
...
}
、 Doctrineは、ディスクリミネータマップ内のすべてのエンティティに対して左結合を行います(そして、MySQLの一般的なエラーを生成します)。
にformType:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('childrenEntities', 'entity', array(
'class' => 'AcmeEntityBundle:Entity',
'required' => false,
'choice_label' => 'slug', // slug is defined as a main entity's attribute
'query_builder' => function (EntityRepository $er) {
return $er->getSomeEntities();
},
));
...
}
EntityRepository:
public function getSomeEntities()
{
return $this->getEntityManager()
->createQueryBuilder()
->select('e')
->from('AcmeEntityBundle:Entity', 'e')
->where('e.id IN (:ids)')
// Tried that, doesn't work
//->andWhere('e INSTANCE OF AcmeEntityBundle:Entity')
->setParameter('ids', [53300, 12345]);
}
いずれかに参加するためにはない教義を伝える方法はありますか? 2.4
私は読んでいくつかの便利なDOC:
-
である私は、メインのエンティティの属性は、そのようなIDやスラグを必要とするので、私はサブのクラスから
- Query field of root entity in doctrine (joined) class table inheritance
- Doctrine2: Arbitrary join and single table inheritance
- http://doctrine-orm.readthedocs.io/projects/doctrine-orm/en/latest/reference/inheritance-mapping.html#class-table-inheritance
Doctrineのバージョンを任意の値を必要としません
ありがとうございました!
私は ' - > select( 'e.id、e.slug)'を試しました。私は、DiscriminatorMap内に2つのクラス(まだ_JOINED_タイプ)のシンプルなケースでそのケースを再現しました。そして唯一の "実体" フィールドに簡単なフォームを作る: 'パブリック関数getSomeEntities(){ 戻ります$ this-> getEntityManager() - > createQueryBuilder() - >を選択し( 'e.id、e.slugを') - > from(' AcmeEntityBundle:Entity '、' e '); } ' – shabang
これは変ですが、核兵器のオプションを使用することはできますか?http://doctrine2.readthedocs.io/en/latest/reference/native-sql.html#native-sql – abdiel
GitHubを見てみましょう:https://github.com/doctrine/doctrine2/issues/5961 – shabang