12

Doctrine Docsに従って基準を設定しようとしています。

残念ながら、関連するオブジェクトの属性にアクセスする方法を教えてくれません。例を挙げましょう。

製品の ArrayCollection があります。すべての製品にはカテゴリがあります。カテゴリ名の ArrayCollection をフィルター処理したいと考えています。今、私は次のように基準を設定しようとしています:

$criteria = Criteria::create()
  ->where(Criteria::expr()->eq("category.name", "SomeCategoryName"));

今、私は次の例外を受け取ります:

An exception has been thrown during the rendering of a template ("Unrecognized field: category.name")

関連するオブジェクトにアクセスするにはどうすればよいですか?

4

2 に答える 2

12

ソースコードを調べましたCriteria::expr()->eq("name", --- second value ---)。2 番目の値には のインスタンスが必要Doctrine\Common\Collections\Expr\Valueです。そのため、別のものを入れExprたりcriteria、そこに入れたりすることはできません。のみExpr AndOr別のを取るExprfilter()のような他の関数でこれを解決するか、イテレータを取得することを想定していると確信していますgetIterator()。これは、メソッドで行うことができるfilter()方法です。

$filteredProducts = 
    $products->filter(function($key, $element) use ($categoryName) {
        return $element->getCategory()->getName() === categoryName;
    });

for each next リレーションを使用できる場合は、Iteratorforeach ループをネストして、それらの内部でフィルター処理できます。

于 2013-08-10T08:56:42.153 に答える
4

これはおそらく、フィルター メソッドではなく、リポジトリ メソッドに属します。親オブジェクト (Order など) のコレクションで事前にフィルター処理された製品のリストを取得する場合は、クエリ ビルダーで子コレクションをフィルター処理できます。ただし、オブジェクトが完全に水和されていないという混乱を招く可能性のある副作用に対処する必要があります。

これにより、カテゴリ名に一致する子Orderのみを持つオブジェクトのリストが表示されます。Product

class OrderRepository extends EntityRepository {
  public function findOrderWithProductCategory($category)
  {
    $builder = $this->createQueryBuilder('o')
      ->select('o, p')
      ->leftJoin('o.products', 'p')
      ->join('p.category', 'c', 'WITH', 'c.name = :category')
      ->setParameter('category', $category);
  }
}

関心のあるカテゴリの種類が後でわからない場合は、とにかく @Flip のソリューションを使用して、すべてのカテゴリを事前に水和することをお勧めします。部分的な水分補給と標準的な閉鎖を使用ArrayCollection::filter()すると、ほとんどの場合、かなりうまく機能します.

とは言っても、機能としてはかなりいいでしょう。Criteria現在の実装は非常に軽量であり、おそらくそれを維持したいと考えているため、Doctrine の担当者は気が進まないのではないかと思います。

于 2015-04-09T01:42:23.147 に答える