JunctionTables in Doctrine

Man stelle sich vor, man hat zwei Tabellen: Person und Account. Dazwischen gibt es die klassische Junction-Tabelle: PersonJuncAccount. Soweit lässt sich das in Doctrine prima abbilden. Was ist aber, wenn man der JunctionTable mehr als den PrimaryKey sowie die beiden ForeignKeys mitgeben möchte, beispielsweise noch die Rechte der Person auf dem Account? Dann ist es nicht mehr einfach möglich, per Doctrine-Funktion die Objekte auf der anderen Seite der Junction-Table zu holen. Mit einem kleinen Codeschnipsel kann man aber die Lücke schließen:

    /* File: Entity/Person.php */

    public function getAccounts()
    {
        return new ArrayCollection(array_map(
            function ($j) {
                return $j->getAccount();
            },
            $this->getJuncAccounts()->toArray()
        ));
    }

Ein weiteres Problem ist, wenn man eine Assoziation filtern möchte. Beispielsweise nach „nicht ausgelaufenen“ Datensätzen. Hier die Lösung:

    /* File: Entity/Person.php */

    public function getContracts()
    {
      // see: http://www.boxuk.com/blog/filtering-associations-with-doctrine-2/
        $criteria = Criteria::create();
        $criteria->where(Criteria::expr()->isnull('expiredAt'));

        return $this->contracts->matching($criteria);
    }