2017-10-26 13 views
0

RoundMatch.php私は区別エンティティに関連するエンティティに参加するにはどうすればよいsymfonyの教義は、弁別列

/** 
* @ORM\Entity(repositoryClass="MyApp\MyBundle\Repository\RoundMatchRepository") 
* @ORM\InheritanceType("JOINED") 
* @ORM\DiscriminatorColumn(name="type", type="string") 
* @ORM\DiscriminatorMap({"team_round_match" = "TeamRoundMatch", "player_round_match" = "PlayerRoundMatch"}) 
* @ORM\Table("my_round_match") 
*/ 
abstract class RoundMatch 
{ 

    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var \DateTime 
    * 
    * @ORM\Column(name="match_date", type="datetime") 
    */ 
    private $matchDate; 

がすることを企業に関連するでしょうか? 区別されたテーブルの列に直接アクセスして結合を作成することはできません。

区別されたテーブルの列にアクセスして結合を作成することはできません。 子供エンティティを弁別者のエンティティに参加させるにはどうすればよいですか?私が作成した

は次のように結合します

RoundMatchRepository.php

public function getMatchesWithNoResultsSubmitted() 
    { 
      $qb = $this->createQueryBuilder("rm"); 
      $qb->leftJoin("rm.round", "rnd") 
      ->leftJoin("rnd.group", "sg") 
      ->leftJoin("sg.server", "ss") 
      ->leftJoin("ss.stage", "ts") 
      ->leftJoin("ts.tournament", "t") 
      ->leftJoin("MyAppMyBundle:PlayerRoundMatch", "prm", "WITH", "rm.id = prm.id") 
      ->leftJoin("prm.player1", "p1") 
      ->leftJoin("prm.player2", "p2") 
      ->leftJoin('p1.gameProfiles',"gp1") 
      ->leftJoin('p2.gameProfiles',"gp2") 
      ->leftJoin('p1.gameProfiles', 'gp1', "WITH", $qb->expr()->andX(
        $qb->expr()->eq('t.game', 'gp1.game'), 
        $qb->expr()->eq('prm.player1', 'gp1.player') 
       )) 
      ->leftJoin('p1.gameProfiles', 'gp2', "WITH", $qb->expr()->andX(
        $qb->expr()->eq('t.game', 'gp2.game'), 
        $qb->expr()->eq('prm.player2', 'gp2.player') 
       )); 
       return $qb->getQuery()->getResult(); 
} 

を私は小枝に結果オブジェクトを使用すると、彼らはオブジェクトの関係を介して接合されていないので、私は返されたオブジェクト内のエンティティに入社取得することはできません。 ディスクリミネータを介して1対1で結合されているため、オブジェクト関係は作成されていません。

+1

[Doctrine 2 - where句でのdiscriminatorカラムの使い方](https://stackoverflow.com/questions/5988636/doctrine-2-how-to-use-discriminator-column-in-where-句) – LBA

+0

あなたの質問をもっと見る。個人的には、私はテーブルの継承があなたの要件に対する答えだとは思わない。試合には、おそらく日付付きの独自のレコードが必要です。そして、単純な関係は、<->、 'team'のようになります。 –

答えて

0

私は単一テーブル継承を使用して動的関係を達成しました。これにより、リレーションまたは識別クラスに対してDQLを記述することができます。

DQLを使用してディスクリミネータに「照会」することはできません。エンティティ名の入力が必要です。possible duplicate @ LBAのコメント

この結果のスキーマでは、group_idは、ディスクリミネータによって異なる関係を意味します。

明らかに、これはデータベースにパフォーマンス上の影響があります。

/** 
* @ORM\Entity 
* @ORM\InheritanceType("SINGLE_TABLE") 
* @ORM\DiscriminatorColumn(name="type", type="string", length=255) 
* @ORM\DiscriminatorMap(
* {"parents" = "Parents", "children" = "Child"} 
*) 
* @ORM\Table("people") 
*/ 
class Person 
{ 
    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var mixed 
    */ 
    private $group; 
} 

/* 
* @ORM\Table("parents") 
*/ 
class Parent extends Person 
{ 
    /** 
    * Many parents have one group. 
    * 
    * @ManyToOne(targetEntity="ParentGroups", inversedBy="parents") 
    * @JoinColumn(name="group_id", referencedColumnName="id") 
    */ 
    private $group; 
} 

/* 
* @ORM\Table("children") 
*/ 
class Child extends Person 
{ 
    /** 
    * Many children have one group. 
    * 
    * @ManyToOne(targetEntity="ChildGroups", inversedBy="children") 
    * @JoinColumn(name="group_id", referencedColumnName="id") 
    */ 
    private $group; 
} 

/* 
* @ORM\Table("parent_groups") 
*/ 
class ParentGroups 
{ 
    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * One group has many parents. 
    * 
    * @OneToMany(targetEntity="Parent", mappedBy="group") 
    */ 
    private $parents; 

    public function __construct() { 
     $this->parents = new ArrayCollection(); 
    } 
} 

/* 
* @ORM\Table("child_groups") 
*/ 
class ChildGroups 
{ 
    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * One group has many parents. 
    * 
    * @OneToMany(targetEntity="Child", mappedBy="group") 
    */ 
    private $children; 

    public function __construct() { 
     $this->children = new ArrayCollection(); 
    } 
} 

効果的に、拡張テーブルは、親の注釈(存在する場合)を上書きすることができます。

また作業が夢だと私たちは私たちのモノリス:)

未テストコードでこの複数の用途を有しているが、それはあなたに私はそれを達成する方法のアイデアを与える必要があります。あなたがここから苦労したら、私は行こうとして、それが実行されることを確認します。

関連する問題