doctrine2:不同的查询方式,不同的结果

时间:2012-09-22 04:03:47

标签: doctrine-orm doctrine-query

有人可以解释一下,为什么我会得到不同的结果?

$user = new UserEn();
$user->setName("test");
$em->persist($user);

$result1 = $em->find('UserEn', 'test');

$result2 = $em->getRepository('UserEn')->findBy(array('name'=>'test'));

$q = $em->createQuery('select u from UserEn u where u.name = :name');
$q->setParameter('name', 'test');
$result3 = $q->getResult();

只有$ result1持有$ user,这是我的预期,其他是null。怎么了? (请不要说我需要拨打$ em-> flush();)

2 个答案:

答案 0 :(得分:1)

因为Doctrine无法确定您是否专门请求查询中名称属性设置为User的{​​{1}}对象,所以它会查询数据库(忽略缓存机制),将结果集映射到实体对象,在实体管理器中加载它们,如果找到任何数据则返回实体对象[s]的数组。所以这里没有实体经理的参与。如果您使用test而不是find($id),情况会有所不同,因为现在Doctrine会首先检查实体管理器,如果找不到则查询数据库。

答案 1 :(得分:0)

$ RESULT2

这将返回一个数组,该数组包含名称为test的所有实体:

$result2 = $em->getRepository('UserEn')->findBy(array('name'=>'test'));

为了只获得一条记录,您应该使用findOneBy代替findBy

$result2 = $em->getRepository('UserEn')->findOneBy(array('name'=>'test'));

$ result3

$result3中,您应该拨打$q->getSingleResult()而不是$q->getResult()

$result3 = $q->getSingleResult();