sql >> データベース >  >> RDS >> Mysql

DoctrineとSymfony2を使用した多対多の関係で内部結合はどのように機能しますか

    ManyToManyの使用 2つのエンティティ間には、DQL(doctrine query)を構築するときに、このタイプのリレーションで一般にジャンクションテーブルと呼ばれる3番目のテーブルが含まれます。ドクトリンは、アノテーションとして定義したリレーションの性質に応じてジャンクションテーブルを自動的に結合するため、クエリを考慮します

    >
    $teamsingroup = $em->getRepository("AppBundle\Model\Entity\Team")
                        ->createQueryBuilder('o')
                        ->innerJoin('o.group', 't')
    

    Teamに参加しています Groupを持つエンティティ innerJoin('o.group')のエンティティ パートo チームエンティティとo.groupのエイリアスです Teamで定義されたプロパティを指します groupという名前のエンティティ 。

    /**
     * @ORM\ManyToMany(targetEntity="Groups", mappedBy="team")
     */
    protected $group;
    

    ManyToManyがあります このタイプの関係ドクトリンに対して定義されたアノテーションは、最初にチームテーブルをジャンクションテーブルと結合し、次にジャンクションテーブルをグループテーブルと結合します。結果のSQLは次のようになります

    SELECT t.*
    FROM teams t
    INNER JOIN junction_table jt ON(t.id = jt.team_id)
    INNER JOIN groups g ON(g.id = jt.group_id)
    WHERE g.id = @group_id
    

    各グループのチームを取得する方法に関連するもう1つの点は、createQueryBuilderを除外することでコードを最小限に抑えることができることです。 チームプロパティをArrayCollectionとして定義したら、ループ内の一部 つまり、$this->team = new ArrayCollection(); 各グループオブジェクトで、getTeam()を呼び出すことにより、その特定のグループに関連付けられたチームのコレクションを取得します。 以下のコードと同様に、グループオブジェクトで機能します。

    foreach ($groups as $group) {
        $teamsingroup = $group->getTeam();
        echo "</b>".$group->getGroupname()."</b></br>";
        foreach ($teamsingroup as $teamingroup) {
            echo $teamingroup->getTeam()."</br>";
        }
    }
    


    1. MySQL SIGN()関数–MySQLで数値が正か負かを調べる

    2. Oracleデータベース内のすべての関数とプロシージャのリストを取得します

    3. SQL Serverは、集計でランダムな(または最初の)値を選択します

    4. PostgreSQLは、欠落している場合、前の行の値を使用します