[英]Do we have to clear the query builder between 2 queries in Doctrine2?
我面临的情况是,“ D2查询”构建器针对2个不同的请求返回两次第一个请求的结果。
我正在做以下两个查询:
$friends['interests'] = $this->retrieveUsersByCat( $user, $minLat, $maxLat, $minLng, $maxLng, $lat, $lng, $cat ); //This should return Deena
$friends['available'] = $this->retrieveUsersAvail( $user, $minLat, $maxLat, $minLng, $maxLng, $lat, $lng ); // This should return Obiwan
第一个应该返回Deena-仅执行此查询时可以正常工作
第二个应该返回Obiwan-仅执行此查询时可以正常工作
但是,当一个接一个地执行2个查询时(在我的代码中与这里的文字相同),它两次返回Deena。 所以我想这将来自我自己的查询本身,但事情是这样的:如果我将两个查询都转换为类似的内容:
$friends['available'] = $this->retrieveUsersAvail( $user, $minLat, $maxLat, $minLng, $maxLng, $lat, $lng );
$friends['interests'] = $this->retrieveUsersByCat( $user, $minLat, $maxLat, $minLng, $maxLng, $lat, $lng, $cat );
然后它两次返回Obiwan,就像我的结果被覆盖一样。 因此,我直接查看查询以查看返回的内容。 问题直接来自D2对于每个查询返回什么。
现在另一个奇怪的事情是,如果我在一个查询中要求一个数组(例如retrieveUsersByCat),那么我得到了预期的结果。 (Deena和Obiwan)但我想保持数据一致。
这很奇怪,我一直在尝试查询本身而没有成功。
有人可以帮我吗?
这是两个查询:
public function retrieveUsersByCat( $user, $minLat, $maxLat, $minLng, $maxLng, $lat, $lng, $cat )
{
//We only want to return users nearby who are available OR who
$qb = $this->getEntityManager()->createQueryBuilder();
$qb->select( 'USER', 'FRIENDS' )
->from( 'Entity\User', 'USER' )
->where( 'USER = :user' )
->leftJoin( 'USER.friends', 'FRIENDS' )
->andWhere( ':cat MEMBER OF FRIENDS.interests' )// THAT WAS IT !! MEMBER OF perform a where in a many to many !!
->andWhere(
$qb->expr()->andX(
$qb->expr()->between( 'FRIENDS.latitude', ':minLat', ':maxLat' ),
$qb->expr()->between( 'FRIENDS.longitude', ':minLng', ':maxLng' )
)
);
$array = array(
'cat' => $cat,
'user' => $user,
'minLat' => $minLat,
'maxLat' => $maxLat,
'minLng' => $minLng,
'maxLng' => $maxLng
);
$qb->setParameters( $array );
$userReturned = $qb->getQuery()->getOneOrNullResult(); // NO USER RETURNED if no friends matches!
if ( $userReturned )
{
return $userReturned->getFriends();
}
else
{
return false;
}
}
和
public function retrieveUsersAvail( $user, $minLat, $maxLat, $minLng, $maxLng, $lat, $lng )
{
//We only want to return users nearby who are available OR who
$qb = $this->getEntityManager()->createQueryBuilder();
$qb->select( 'USER', 'FRIENDS' )
->from( 'Entity\User', 'USER' )
->where( 'USER = :user' )
->leftJoin('USER.friends', 'FRIENDS')
->andWhere(
$qb->expr()->andX(
$qb->expr()->eq( 'FRIENDS.available', 1 ),
$qb->expr()->between('FRIENDS.latitude', ':minLat', ':maxLat'),
$qb->expr()->between('FRIENDS.longitude', ':minLng', ':maxLng')
)
)
->add( 'orderBy', $qb->expr()->sum( 'FRIENDS.latitude - :lat', 'FRIENDS.longitude - :lng' ) );
$array = array(
'user' => $user,
'minLat' => $minLat,
'maxLat' => $maxLat,
'minLng' => $minLng,
'maxLng' => $maxLng,
'lat' => $lat,
'lng' => $lng
);
$qb->setParameters( $array );
// $qb->setFirstResult( $offset );
// $qb->setMaxResults( $limit );
$usersAvail = $qb->getQuery()->getOneOrNullResult();
if ( $usersAvail )
{
return $usersAvail->getFriends();
}
else
{
return False;
}
}
2个答案:
$ EM->清晰(); 从EntityManager(em)分离所有实体
$ em-> detach($ entity)仅分离一个实体。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.