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
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:
- Jak ze $seasonEntity vytahnu vsechny ligy v sezone serazene posle sloupce name?
- Jak ze $seasonEntity vytahnu vsechny ligy v sezone které nejsou aktivni? active == 0
- Filip Procházka
- Moderator | 4668
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.