我面临的情况是,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)但我希望保持数据的一致性。
这很奇怪,我一直在试图解决问题本身而不是成功。
有人可以帮我吗?
以下是2个查询:
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;
}
}
答案 0 :(得分:1)
2个答案:
$ EM->清除();从EntityManager(em)中分离所有实体
$ em->分离($ entity)只分离一个实体。