Doctrine: Entita join podmínka

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
motorcb
Člen | 552
+
0
-

Zdravím. Mám následující 2 entity. Sezona a liga. V lize muze byt nekolik sezon:

Sezona:

/**
 * @ORM\Entity
 */
class Season extends \Kdyby\Doctrine\Entities\BaseEntity
{

    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue
     */
    protected $id;

    /**
     * @ORM\Column(type="string", length=64, nullable=FALSE)
     * @var string nazev
     */
    protected $name;

    /**
     * @ORM\OneToMany(targetEntity="League", mappedBy="season", cascade={"persist"})
     */
    protected $leagues;
}

Liga:

/**
 * @ORM\Entity
 */
class League extends \Kdyby\Doctrine\Entities\BaseEntity
{

    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue
     */
    protected $id;

    /**
     * @ORM\Column(type="string", length=64, nullable=FALSE)
     * @var string nazev
     */
    protected $name;

    /**
     * @ORM\Column(type="smallint", nullable=TRUE)
     * @var smallint
     */
    protected $active;

    /**
     * @ORM\ManyToOne(targetEntity="Season", inversedBy="leagues", cascade={"persist"})
     * @var Season
     */
    protected $season;

}

OK:

//ze $seasonEntity zjistim vsechny ligy v sezone
$seasonEntity->leagues

Dotazy:

  1. Jak ze $seasonEntity vytahnu vsechny ligy v sezone serazene posle sloupce name?
  2. Jak ze $seasonEntity vytahnu vsechny ligy v sezone které nejsou aktivni? active == 0
Filip Procházka
Moderator | 4668
+
0
-

Jak píše @DavidMatějka. A ještě je možné tohle udělat přímo na úrovni DQL, díky čemuž v té entitě budeš už mít jenom to co tě zajímá, relace bude ovšem vyfiltrovaná a tedy se nemáš jak dostat k těm entitám, které jsi odfiltroval. Musel bys položit nový dotaz, kde by sis načetl ty ostatní. Nebo vyčistit pamět entitymanageru a načíst prostě entitu znova.

Například máš produkt s akcemi a protože akce které už expirovaly jsou nerelevantní, tak si uděláš leftJoin s filtrem

SELECT product, action
FROM My\Product product
LEFT JOIN product.actions action WITH action.endsAt > CURRENT_TIMESTAMP

a položí se SQL, který ti vrátí jen to co tomu odpovídá a tedy v té asociaci budeš tam mít jenom aktuální akce, nebo žádné – staré tam nebudou.