繁体   English   中英

我们是否需要清除Doctrine2中2个查询之间的查询生成器?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM