Doctrine中的FindBy方法如何使用“OR条件”?

4

Doctrine的findBy()方法是否支持使用OR语句?

我希望输出结果如下:

SELECT * FROM `friends` WHERE userId=1 OR FriendId=1 ;

现在的代码:

$user = $repository->findBy(array(
            'userId' => $this->getRequest()->getSession()->get('id')
    );
2个回答

4

我只会使用DQL……在你的repository中添加这样一个函数:

public function findFriends($userId)
{
    return $this->getEntityManager()
        ->createQuery('SELECT f FROM Friends WHERE userId = :userId OR FriendId = :userId')
        ->setParameter('userId', $userId)
        ->getOneOrNullResult();
}

或者使用查询构建器代替DQL:

public function findFriends($userId)
{
    return $this->getEntityManager()
        ->createQueryBuilder()
        ->from('Friends', 'f')
        ->where('f.userId = :userId')
        ->orWhere('f.friendId = :userId')
        ->setParameter('userId', $userId)
        ->getQuery()
        ->getOneOrNullResult();
}

然后只需要使用:

$user = $repository->findFriends($this->getRequest()->getSession()->get('id'));

3

MongoDB特定语法

您可以在传递给findBy的数组中使用$or$and关键字:

$id = $this->getRequest()->getSession()->get('id');
$user = $repo->findBy(
    array(
        '$or' => array(
            array('userId' => $id),
            array('FriendId' => $id),
        ),
    );
);

使用 QueryBuilder:

但是考虑到这是针对 mongoDB 的特定内容,可能无法回答您的问题。使用 QueryBuilder,您可以直接编写以下代码:

$qb = $repository->createQueryBuilder();
$qb->select('f')
    ->from('friends', 'f')//replace friends with the correct entity name
    ->where('f.userId = :uid')
    ->orWhere('f.FriendId = :fid')
    ->setParameter('uid', $id)
    ->setParameter('fid', $id);
$users = $qb->getQuery()->getSingleResult();//or more

你可以使用查询构建器表达式来构建or子句,示例如下:
$qb->where(
        $qb->expr()->orX(
            $qb->expr()->eq('f.userId', ':uid'),
            $qb->expr()->eq('f.FriendId', ':fid')
        )
    )
    ->setParameter('uid', $id)
    ->setParameter('fid', $id);

这里有更多信息

尽管您两次使用相同的值,但必须调用setParameter两次。 原因可以在此找到

最后,关于QueryBuilder类的一些更多文档请参考这里


4
你尝试过你的查询吗?两个都不起作用。 - Cerad
@Cerad:我没有注意到OP可能 使用MongoDB。我已经更新了我的答案。 - Elias Van Ootegem
对我来说:无法识别的字段:$or - user10224754

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接