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

Doctrine orm doctrine2:不同的查询方式,不同的结果,doctrine-orm,doctrine-query,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('sel

有人能解释一下为什么我会得到不同的结果吗

$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();)

$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()


由于Doctrine无法确定您正在从查询中明确请求一个名属性设置为
test
User
对象,因此它会查询DB(忽略缓存机制),将结果集映射到实体对象,将其加载到实体管理器中,如果发现任何数据,则返回实体对象数组。因此,这里没有实体经理的参与。如果您使用
find($id)
而不是
findBy()
,情况会有所不同,因为现在条令将首先检查实体管理器,如果找不到,则查询数据库。

$result2
$result3
应该返回一个数组,我认为……在我用findOneBy测试它时,应该包含您的实体代码+映射,我收到:虽然至少需要一行,但找不到查询结果。这意味着“findBy”也找不到对象。使用getSingleResult:虽然至少需要一行,但找不到查询的结果。这也意味着“getResult”也找不到对象。有趣的是“$result1=$em->find('UserEn','test');”有效$结果1:UserEn对象{Username=>(string)test Userregist=>null Usercon=>(int)0 Userlast=>DateTime对象{date=>(string)1990-01-01 00:00:00 timezone_type=>(int)3 timezone=>(string)Europe/Berlin}@user1592714,如果使用
$em->find('UserEn',test'))
而且它可以工作…看起来
名称是主键。:s
$result3 = $q->getSingleResult();