php - Symfony2 QueryBuilder 按 ID 顺序返回产品查询

标签 php mysql symfony query-builder

我有一个任意顺序的 ID 列表:

array(57, 12, 29, 25, 11)

使用 Symfony 的 QueryBuilder,我只需要从所有数据库对象中返回这些产品,并且它们应该按此特定顺序返回。

我需要返回查询,而不是结果。

我正在尝试所有不同的方法:

    public function querySortedProductsInCategories($id, $type, $slug, $sort)
    {

        $qb = $this->createQueryBuilder('p');
        $qb->addSelect(array('p', 'gallery'));
        $qb->addSelect(array('p', 'media'));
        $qb->addSelect(array('p', 'image'));
        $qb->leftJoin("p." . $type, "c");
        $qb->leftJoin('p.gallery', 'gallery');
        $qb->leftJoin('gallery.galleryHasMedias', 'media');
        $qb->leftJoin('media.media', 'image');
        $qb->where("c." . $type. "= :id ");
        $qb->andWhere("p.status = 1 ");
        $qb->SetParameter('id', $id);
//        $qb->andWhere($qb->expr()->in('p.id', $sort));
//        $qb->andWhere("p.id IN (:sort) ");
//        $qb->SetParameter('sort', $sort);
        return $qb->getQuery();
    }

我尝试了 IN 语句....它返回了我需要的列表,但顺序不正确。

现在我开始认为这样做是不可能的。 Stackoverflow 是我解决这个问题的最后机会......

更新:

尝试创建我的 DQL 函数,但出现错误。第一次这样做,我不知道发生了什么......

class Field extends \Doctrine\ORM\Query\AST\Functions\FunctionNode
{

    /**
     * @override
     */
    public function parse(\Doctrine\ORM\Query\Parser $parser) {
        $parser->match(Lexer::T_IDENTIFIER);
        $parser->match(Lexer::T_OPEN_PARENTHESIS);
        $this->stringPrimary = $parser->StringPrimary();
        $parser->match(Lexer::T_COMMA);
        $this->stringSecondary = $parser->StringPrimary();
        $parser->match(Lexer::T_COMMA);
        $this->stringThird = $parser->StringPrimary();
        $parser->match(Lexer::T_CLOSE_PARENTHESIS);
    }


    /**
     * @param \Doctrine\ORM\Query\SqlWalker $sqlWalker
     *
     * @return string
     */
    public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker)
    {
        // TODO: Implement getSql() method.
    }

}

查询:

        $em = $this->getEntityManager();
        $doctrineConfig = $em->getConfiguration();
        $doctrineConfig->addCustomStringFunction('FIELD', 'Mp\ShopBundle\Doctrine\Field');

        $qb = $this->createQueryBuilder('p');
        $qb->addSelect(array('p', 'gallery'));
        $qb->addSelect(array('p', 'media'));
        $qb->addSelect(array('p', 'image'));
        $qb->addSelect(array("p, field(p.id, " . implode(", ", $sort) . ") as HIDDEN field"));
        $qb->leftJoin("p." . $type, "c");
        $qb->leftJoin('p.gallery', 'gallery');
        $qb->leftJoin('gallery.galleryHasMedias', 'media');
        $qb->leftJoin('media.media', 'image');
//        $qb->where("p.id = :sort ");
        $qb->where("c." . $type. "= :id ");
        $qb->andWhere($qb->expr()->in('p.id', $sort));
        $qb->andWhere("p.status = 1 ");
        $qb->setParameter('id', $id);
//        $qb->setParameter('sort', $sort);
        $qb->orderBy('field');
        return $qb->getQuery();

错误:

Error: Expected StateFieldPathExpression | string | InputParameter | FunctionsReturningStrings | AggregateExpression, got '23'

查询:

[1/2] QueryException: SELECT p, p, gallery, p, media, p, image, p, field(p.id, 23, 40, 30, 24, 42, 37, 38, 58, 33, 8, 34, 35, 36, 28, 51, 14, 1) as HIDDEN field FROM Mp\ShopBundle\Entity\Product p LEFT JOIN p.subcategory c LEFT JOIN p.gallery gallery LEFT JOIN gallery.galleryHasMedias media LEFT JOIN media.media image WHERE c.subcategory= :id AND p.id IN(23, 40, 30, 24, 42, 37, 38, 58, 33, 8, 34, 35, 36, 28, 51, 14, 1) AND p.status = 1 ORDER BY field ASC

最佳答案

使用 MySQL,您可以创建一个 DQL 函数来使用 FIELD :

请参阅其他类似问题:

Doctrine 2 mysql FIELD function in order by

关于php - Symfony2 QueryBuilder 按 ID 顺序返回产品查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38630080/

相关文章:

php - 跟踪一系列分页结果的项目总数

php - 欧洲的 IP 范围?用PHP检测?

javascript - 使用 Symfony/PHP7 的 Handlebars / mustache

php - 一个 MySQL 插入生成 3 行而不是 1 行

mysql - 在 MySQL 中插入唯一行的最便宜的方法?

MySQL:如果表中不存在则插入记录

php - 使用 php 从数据库中的数据创建超链接

php - Artisan::call ('migrate' ) 将 Laravel 升级到 4.2 后无法正常工作

php - 无法在本地主机上启动 Symfony 2.7

php - 如何使用 Phpunit 代理原始方法并同时禁用构造函数?