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