Symfony querybuilder orderby失败

时间:2017-02-13 08:59:07

标签: symfony query-builder

在一个查询构建器中,我做了一个orderby,但是如果我命令一个' leftjoin'我的订单不起作用,我不明白为什么。

我的查询编译器:

        $qb = $this->createQueryBuilder('r')
        ->leftJoin('r.clientCategorisation', 'cc')
        ->leftJoin('cc.categorisation', 'c')
        ->addOrderBy('c.id','ASC')
    $a_result = $qb->getQuery()->getResult();
    return $a_result;

如果我订购了我的' r,那就没关系,但如果我尝试订购' c'那不起作用...... 我可以订购我的' c' asc如果在我看来html.twig我添加:

{{  clientCategorisation.categorisation.id}}

我不明白为什么???这种方法仅适用于asc',#39; desc'失败。

编辑:我有一个数据表,在我的表中,我的订单是在一个对象上:

A_resultats = $this->_O_resultatsR->getByRapportOrderByCat($idRapport, $A_onglet);

getByRapportOrderByCat是我的查询构建者。

然后在foreach:

foreach ( $A_resultats as $I_key => $O_resultat ) {

我构建我的专栏,并在此专栏中分析':

$A_valuesForTableau[$I_key]['analyse'] = $this->render('mypath', array(
                    'O_resultat'        => $O_resultat,
                    'A_clientCats'        => $A_clientCats,
            ))->getContent();

我再次将我的对象$ O_resultat提供给模板(如果评论此对象在分析我的订单时很好),我认为在模板中我的订单来自querybuilder被asc替换(基本顺序)。

抱歉我的英语不好。

edit2: 实体重新安排:     class Resultat     {         / **          * @var整数          *          * @ORM \ Column(name =" id",type =" integer")          * @ORM \ Id          * @ORM \ GeneratedValue(策略=" AUTO")          * /         私人$ id;

    /**
     * @ORM\ManyToOne(targetEntity="ClientCategorisation")
     * @ORM\JoinColumn(name="client_categorisation", referencedColumnName="id", onDelete="CASCADE", nullable=true)
     */
    private $clientCategorisation;


    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set clientCategorisation
     *
     * @param ClientCategorisation $clientCategorisation
     * @return Resultat
     */
    public function setClientCategorisation(ClientCategorisation $clientCategorisation = null)
    {
        $this->clientCategorisation = $clientCategorisation;

        return $this;
    }

    /**
     * Get clientCategorisation
     *
     * @return ClientCategorisation 
     */
    public function getClientCategorisation()
    {
        return $this->clientCategorisation;
    }

}

实体clientcategorisation:

class ClientCategorisation 
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="Categorisation")
     * @ORM\JoinColumn(name="categorisation", referencedColumnName="id", onDelete="CASCADE")
     */
    private $categorisation;

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set categorisation
     *
     * @param string $categorisation
     * @return ClientCategorisation
     */
    public function setCategorisation($categorisation)
    {
        $this->categorisation = $categorisation;

        return $this;
    }

    /**
     * Get categorisation
     *
     * @return string 
     */
    public function getCategorisation()
    {
        return $this->categorisation;
    }

}

分类实体:

class Categorisation
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="nom", type="string", length=255)
     */
    private $nom;

    /**
     * @var integer
     *
     * @ORM\Column(name="ordre", type="integer", nullable=true)
     */
    private $ordre;

    /**
     * Get id
     *
     * @return integer
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set nom
     *
     * @param string $nom
     * @return Categorisation
     */
    public function setNom($nom)
    {
        $this->nom = $nom;

        return $this;
    }

    /**
     * Get nom
     *
     * @return string
     */
    public function getNom()
    {
        return $this->nom;
    }


    /**
     * Set ordre
     *
     * @param integer $ordre
     * @return Categorisation
     */
    public function setOrdre($ordre)
    {
        $this->ordre = $ordre;

        return $this;
    }

    /**
     * Get ordre
     *
     * @return integer
     */
    public function getOrdre()
    {
        return $this->ordre;
    }
}

edit2:我找到了一个解决方案,当我使用' O_resultat'我的订单失败了,所以在我的模板中我得到了A_resultats'这样的工作:

{% for O_resultats in A_resultats %}
    {% if O_resultats.id == O_resultat.id %}

我用O_resultats替换了我的视觉O_resultat

2 个答案:

答案 0 :(得分:0)

尝试将该字段添加为select参数并标记为hidden,以便不修改水化流程(对象而不是数组),如下所示:

    $qb = $this->createQueryBuilder('r')
        ->addSelect('c.id as HIDDEN mysort')
        ->leftJoin('r.clientCategorisation', 'cc')
        ->leftJoin('cc.categorisation', 'c')
        ->addOrderBy('mysort','ASC');
    $a_result = $qb->getQuery()->getResult();

    return $a_result;

希望这个帮助

答案 1 :(得分:0)

您似乎在order-by映射的orderBy关系中有categorisation标记或clientCategorisation注释。如果您有该注释,则您的订单将由您在query builder中创建的订单明确合并。

示例:

<?php

/** @Entity **/
class User
{
    // ...

    /**
     * @ManyToMany(targetEntity="Group")
     * @OrderBy({"id" = "ASC"})
     **/
    private $groups;
}

如果你创建这样的查询:

$qb = $this->createQueryBuilder('user')
    ->leftJoin('user.groups', 'group')
    ->orderBy('group.name', 'DESC')
;

doctrine执行的最终查询将是:

SELECT user FROM User LEFT JOIN user.groups group ORDER BY group.id ASC, group.name DESC;

因此结果将由group.id ASC(在映射中定义)排序,然后由group.name DESC(在查询构建器中定义)排序。

如果您希望能够按group.name DESC排序(例如),则必须删除注释中的@OrderBy({"id" = "ASC"})

请参阅Ordering To-Many Associations