我们是否必须在Doctrine2中的2个查询之间清除查询构建器?

时间:2014-05-07 18:44:50

标签: php mysql sql doctrine-orm doctrine

我面临的情况是,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;
    }
}

1 个答案:

答案 0 :(得分:1)

2个答案:

$ EM->清除();从EntityManager(em)中分离所有实体

$ em->分离($ entity)只分离一个实体。