Ho un filtro ascoltatore Doctrine2 & che funge da filtro per escludere qualsiasi entità non approvata/bozza, che funziona bene sull'entità a cui è applicata, tuttavia, non vedo come farlo funzionare per le sue relazioni .Come posso implementare un filtro Doctrine2 basato su una relazione?
Diciamo che l'entità si chiama Category, quindi ho prodotti relativi a tale categoria, quando faccio un findBy()
per prodotti, ho bisogno della query per verificare che la categoria a cui si riferiscono sia approvata.
select * from products p
left join category c on p.category_id = c.id
where p.id = 5
and c.approved = true
I bit in grassetto sono ciò che deve essere iniettata dal mio filtro o equivalente.
Come posso implementare questo?
Finora ho una sottointerrogazione iniettato come parte del dove nel filtro, ma questo sembra infernale, e sto pensando ci deve essere un modo migliore:
class ApprovableFilter extends SQLFilter
{
protected $listener;
protected $entityManager;
public function addFilterConstraint(ClassMetadata $targetEntity, $targetTableAlias)
{
$config = $this->getListener()->getConfiguration($this->getEntityManager(), $targetEntity->name);
/* this bit works fine for the category */
if (isset($config['approvable']) && $config['approvable']) {
$column = $targetEntity->columnNames[$config['fieldName']];
return $targetTableAlias.'.'.$column.' = true';
}
/* this bit works for products.. but seems like a pretty poor solution */
if (isset($targetEntity->associationMappings['category'])) {
$config = $this->getListener()->getConfiguration(
$this->getEntityManager(),
$targetEntity->associationMappings['category']['targetEntity']
);
return '(
select d.id from dealership d
where d.id = '.$targetTableAlias.'.dealership_id
and d.'.$config['fieldName'].' = true
) is not null';
}
}
Quello che stai facendo sembra il migliore. Cosa faresti se la richiesta già contenga il JOIN? ecc ... – AdrienBrault
@AdrienBrault bene al momento farebbe il join di nuovo e forse rompere, anche gli alias potrebbero teoricamente conflitto, sono sicuro che ci deve essere un modo migliore per farlo rispetto a quello che ho esemplificato, ma io non ho idea di come fare per farlo. – Steve