有人可以解释一下,为什么我得到不同的结果吗?
$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();
只有 $result 1 持有$user,这是我所期望的,其他都是空的。怎么了?(请不要说我需要调用$em->flush();
因为 Doctrine 无法确定您正在专门请求一个 name 属性设置为从查询中test
的 User
对象,所以它会查询 DB(忽略缓存机制),将结果集映射到实体对象,在实体管理器中加载它们,如果找到任何数据,则返回实体对象数组。因此,这里没有实体经理的参与。如果您使用 find($id)
而不是 findBy()
,情况会有所不同,因为现在 Doctrine 将首先检查实体管理器,如果未找到,则查询数据库。
$result 2
这将返回一个数组,该数组保存所有以 test
作为名称的实体:
$result2 = $em->getRepository('UserEn')->findBy(array('name'=>'test'));
为了只获得一条记录,您应该使用 findOneBy
而不是 findBy
:
$result2 = $em->getRepository('UserEn')->findOneBy(array('name'=>'test'));
$result 3
在$result3
中,您应该调用$q->getSingleResult()
而不是$q->getResult()
:
$result3 = $q->getSingleResult();