【问题标题】:Symfony2 Doctrine querybuilder where INSymfony2 Doctrine 查询构建器在哪里
【发布时间】:2013-04-27 17:38:46
【问题描述】:

我在谷歌上浪费了三亿小时,但没有一个解决方案是好的。

我有这个查询生成器:

        $qb2=$this->createQueryBuilder('s')
        ->addSelect('u')
        ->innerJoin('s.user','u')
        ->where("u.id IN(:followeeIds)")
        ->andWhere('s.admin_status = false')
        ->setParameter('user', $user)
        ->setParameter('followeeIds', $arrayFolloweeIds)
        ->orderBy('s.id','DESC')
        ->setMaxResults(15)
    ;

我可以做第二个查询,然后像$qb->getDQL() 一样做,但我会缓存查询吗?

错误:

Invalid parameter number: number of bound variables does not match number of tokens

【问题讨论】:

    标签: doctrine dql query-builder


    【解决方案1】:

    您正在设置用户参数,但我没有看到它在任何地方的查询中使用?

    此外,我在 WHERE IN 和 Doctrine QueryBuilder 上遇到问题,数组也会给我一个类似的错误,奇怪的是,在绑定参数之前运行 array_values 似乎也解决了这些问题。

    尝试:

    $qb2=$this->createQueryBuilder('s')
            ->addSelect('u')
            ->innerJoin('s.user','u')
            ->where("u.id IN(:followeeIds)")
            ->andWhere('s.admin_status = false')
            ->setParameter('followeeIds', array_values($arrayFolloweeIds))
            ->orderBy('s.id','DESC')
            ->setMaxResults(15)
        ;
    

    【讨论】:

    • 天哪,我觉得自己很愚蠢......当然是用户!我没有注意到它......是的,array_values 有帮助!现在终于神奇地工作了 $arrayFolloweeIds=implode("','",$arrayFolloweeIds) ......我希望人们能找到它。谢谢!
    • array_values 也帮助了我。但为什么?我使用的是索引数组。另一方面,使用删除查询它可以在没有array_values 的情况下工作。我正在使用学说/orm v2.5.4
    • 我认为这个问题是由数组上的无序数字索引或可能具有字符串数字索引引起的。虽然不是 100% 肯定,但如果是这样的话,这就是 array_values 起作用的原因,因为它为您提供了一个正确索引的新数组
    【解决方案2】:

    在 Symfony2.8 中,以下示例对我有帮助

    ...
    $qb2->where(
         $qb2->expr()->in('u.id', ':ids')
    )
    ->setParameter('ids', $ids_array)
    ...
    

    【讨论】:

    • 很好,顺便说一句@young,根据变量的值命名变量是一种不好的做法。例如“数组”、“字符串”。一个有意义的名字就足够了:$ids 用于 ID 列表,$id 如果它只是一个整数:)
    • 谢谢,@EnchanterIO。我同意这种情况。但是 PHP 不支持显式类型。那么我怎么知道正在使用哪种类型的变量呢?例如,我有一个用逗号分隔的整数列表,还是 session_keys 数组?你能给出更有分量的论据吗?谢谢:)
    • 当然。如果你有一个用逗号分隔的整数列表,那么你没有数组,你有一个字符串。所以我称之为:commaConcatinatedIds。并迁移到 PHP 7 以获得严格的类型;)如果您有更多问题,可以在 twitter 上联系我:twitter.com/EnchanterIO
    • $ids 意味着多个,所以我期望一个数组。如果不是,我会称它为$idsString,因为它包含一个字符串值并且是异常的。
    猜你喜欢
    • 2014-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-03
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    • 2012-12-21
    相关资源
    最近更新 更多