Doctrine2リスナー&私は、適用されているエンティティでうまく動作する、未承認/草案のエンティティを除外する手段として機能するフィルタを持っていますが、関係のためにそれを動作させる方法はわかりません。関係に基づいてDoctrine2フィルタを実装するにはどうすればよいですか?
商品についてfindBy()
を実行すると、エンティティがカテゴリと呼ばれ、そのカテゴリに関連する商品があるとします。関連するカテゴリが承認されているかどうかを確認するクエリが必要です。
select * from products p
left join category c on p.category_id = c.id
where p.id = 5
and c.approved = true
太字のビットが私のフィルタまたは同等によって注入される必要があるものです。
これを実装するにはどうすればよいですか?
は、これまでのところ私は、フィルタ内のどこの一環として注入されたサブクエリを持っているが、これは地獄のようだ、と私はより良い方法がなければならないと思っています:
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';
}
}
あなたがやっていることが一番良いようです。リクエストにすでにJOINが含まれている場合は、どうしますか? – AdrienBrault
@AdrienBraultもう一度結合をやり直すと同時に、エイリアスが理論的に矛盾する可能性がありますが、これを行うには私が試したことよりも良い方法があるはずですそれをやり遂げる方法を知りません。 – Steve