2

私は現在、ドキュメントを読んでSymfony と Doctrine を学んでいます。

findfindOneByIdの違いがわかりません。この単純な例で両方を使用しようとしましたが、同じことをしているように見えます。

$product = $this->getDoctrine()
                ->getRepository('AcmeStoreBundle:ProductEntity')
                ->findOneById($id);

それらは本当に同じものですか、それとも何か違いがありますか? また、これらすべてのメソッドの詳細なドキュメントはどこにありますか?

4

6 に答える 6

12

あなたの場合、彼らはたまたま同じことをします。この例を見るとfind()、 が主キーにちなんで名付けられたフィールドを探していることがわかります。findOneBy<Field>()主キーでない場合でも、メソッドの名前でフィールドを明示的に使用し、最初のレコードを返します。したがって、最終的に、主キーの名前が実際に である場合、id両方とも同じことを行います。

// query by the primary key (usually "id")
$product = $repository->find($id);

// dynamic method names to find based on a column value
$product = $repository->findOneById($id);
$product = $repository->findOneByName('foo');
于 2012-06-07T17:20:53.237 に答える
2

ここにAPIがありますが、違いはないと思います.2つのメソッドは、呼び出す方法で呼び出すと、次のようになります:

return $this->_em->getUnitOfWork()->getEntityPersister($this->_entityName)->load($id);

__callしかし、find はマジック メソッドを使用せずfind()、現在の作業単位のマップを事前にチェックするのに対し、load() はチェックしないため (@todo を参照)、場合によってははるかに高速になります。

/**                                                                         
 * Loads an entity by a list of field criteria.                             
 * ...
 * 
 * @todo Check identity map? loadById method? Try to guess whether $criteria is the id?
 */                                                                         
public function load(array $criteria, $entity = null, $assoc = null, array $hints = array(), $lockMode = 0) 

find()したがって、preferfindOneById()は、同じことを行う効率の悪い方法です。

于 2012-06-07T17:26:45.087 に答える
1

実際、同じではありません。

考えてみてください。「findBy()」を呼び出すと、エンティティのコレクション (0、1、または複数) を受け取ると想定されます。したがって、すべての結果を取得するには、ArrayCollection を反復処理するか、最初に取得する ( $result->first() ) 必要があります。

クエリが一意のキーによる場合 (この場合のように)、「getOneById()」を呼び出すだけで一意のエンティティを取得でき、結果としてエンティティを受け取ることができます。

/**
 * Retrieving Product with 'findOneBy'
 */
$product = $this->getDoctrine()
                ->getRepository('AcmeStoreBundle:ProductEntity')
                ->findOneById($id);

/**
 * Retrieving Product with 'findBy'
 */
$product = $this->getDoctrine()
                ->getRepository('AcmeStoreBundle:ProductEntity')
                ->findById($id)
                ->first();

意味的には、最初のものが最適です。

*ヒント

エンティティは単に製品と呼ばれる必要があります。なんで?「/Entity」フォルダーの下にあるため(ほとんど、すべき...)、名前空間には「正確に製品とは何か」に関する情報が含まれています

于 2013-08-16T10:38:42.787 に答える
1
// query by the primary key (usually "id")
$product = $repository->find($id);

// dynamic method names to find based on a column value
$product = $repository->findOneById($id);
// $foo is any name which you want to find from database
$product = $repository->findOneByName($foo);
于 2016-11-17T04:48:20.690 に答える
0

最後に同じメソッドを呼び出します。

findByKey('value')

基本的には同じです

findBy(array('key' => 'value'))

key はエンティティのプロパティで、value はプロパティの値です。

findById($id)

上記の特殊なケースです。そしてそうです

find($id)

これらのメソッドはすべて、最終的に同じクエリを実行します。ただし、違いがあります

findBy()

findOneBy()

findOneBy() は単一の結果のみを返し、findBy は要求を満たすすべての結果を返します。

ただし、一般的には、代わりに DQL クエリを使用することをお勧めします。遅延読み込み、配列のハイドレーション、準備済みステートメントなどを検討してください。これはトピックに関する興味深い記事です: Some Doctrine 2 Best Practices

于 2014-08-04T16:04:43.603 に答える
0

同じことですが、私は findOneBy メソッドを好みます。それはより明確です。

于 2014-11-15T03:22:53.410 に答える