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我认为没有什么区别:这两种方法,当调用你调用它们的方式时,这样做:

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

但是在某些情况下 find 会越来越快,因为它不使用__call魔法方法,并且因为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) 

所以 prefer find(),findOneById()只是一种效率较低的方法来做同样的事情。

于 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”文件夹下(Almost, should...),命名空间将包含有关“什么是产品”的信息

于 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 回答