2016-07-28 27 views
1

我有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 
+0

你怎麼得到的返回值時你稱這種方法? – Kilazur

+0

我得到產品清單,但它們是從頭到尾排列的。 – Dominykas55

回答

0

的MySQL,你可以創建一個DQL功能能夠使用FIELD

看到這個其他類似的問題:

Doctrine 2 mysql FIELD function in order by

+0

感謝,看起來像我需要在symfony中安裝DoctrineExtension包..你知道嗎女巫是正確的捆綁? – Dominykas55

+0

不是一個包。你必須編寫你自己的DQL'FIELD'函數。文檔http://symfony.com/doc/current/cookbook/doctrine/custom_dql_functions.html和http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/cookbook/dql-user-defined -functions.html – Alsatian

+0

這個包已經實現了這個功能(還有更多):https://github.com/wiredmedia/doctrine-extensions,但它很舊。我不知道,如果它仍然適用於最新版本的教義。 –

0

您可以按大小寫進行訂購:

$customOrderString = $this->generateCase($ids); 
if(!empty($customOrderString)) { 
    $db->addSelect("(CASE {$customOrderString} ELSE 3 END) AS HIDDEN ORD "); 
    $db->orderBy('ORD', 'DESC'); 
} 
return $qb->getQuery(); 

..... 
private generateCase($ids) { 
    $caseString = ''; 
    foreach($ids as $index=>$id) { 
     $caseString .= "WHEN $id THEN $index"; 
    } 
    return $caseString; 
} 
+0

當然它確實......但那不是我所需要的。 orderBy只能命令asc或desc ..我需要通過我的數組排序(57,12,29,25,11) – Dominykas55

+0

這個數組是如何通過的我在參數中看不到它... –

+0

評論部分: // $ qb-> andWhere(「p.id IN(:sort)」); // $ qb-> SetParameter('sort',$ sort); – Dominykas55

相關問題