我有ID的列表以任意順序:在IDS中的順序Symfony2中的QueryBuilder返回產品查詢
array(57, 12, 29, 25, 11)
隨着Symfony`s的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
聲明....返回列表我需要的,但不能以正確的順序。
現在我開始認爲這是不可能的。計算器是我搞清楚這個...
更新的最後一次機會:
嘗試創建我的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'
QUERY:
[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
你怎麼得到的返回值時你稱這種方法? – Kilazur
我得到產品清單,但它們是從頭到尾排列的。 – Dominykas55