有人可以解释一下,为什么我会得到不同的结果?
$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();)
答案 0 :(得分:1)
因为Doctrine无法确定您是否专门请求查询中名称属性设置为User
的{{1}}对象,所以它会查询数据库(忽略缓存机制),将结果集映射到实体对象,在实体管理器中加载它们,如果找到任何数据则返回实体对象[s]的数组。所以这里没有实体经理的参与。如果您使用test
而不是find($id)
,情况会有所不同,因为现在Doctrine会首先检查实体管理器,如果找不到则查询数据库。
答案 1 :(得分:0)
这将返回一个数组,该数组包含名称为test
的所有实体:
$result2 = $em->getRepository('UserEn')->findBy(array('name'=>'test'));
为了只获得一条记录,您应该使用findOneBy
代替findBy
:
$result2 = $em->getRepository('UserEn')->findOneBy(array('name'=>'test'));
在$result3
中,您应该拨打$q->getSingleResult()
而不是$q->getResult()
:
$result3 = $q->getSingleResult();