在Doctrine Query Builder中,如何实现order by=实体的列名

Aru*_*son 1 php symfony doctrine-orm

我需要根据列的值对列进行排序。

    $vtpQb = $entityManager->createQueryBuilder();
                $vtpQb
                ->from("AppBundle:TrPlace","trplace")
                ->select($view_fectch_fields)
                ->join('AppBundle:TrVwPlacePrivateMarkers', 'vwpm','WITH','trplace.id = vwpm.placeId')
                ->where('vwpm.userid = :userid')
                ->setParameter("userid",$userid)
                ->orderBy('vwpm.tagStatusValue', 'DESC');
                //->orderBy('vwpm.tagStatusValue = 3', 'DESC'); got errorvwpm.tagStatusValue
Run Code Online (Sandbox Code Playgroud)

上面是我的查询,我需要对其进行排序“vwpm.tagStatusValue = 3”,我将如何在 Doctrine Query Builder 中实现它......

Jak*_*zak 6

首先,您不能orderBy在 DQL 中放入表达式,但可以使用计算列。

也没有MySQL IF,但有CASE WHEN

这对我有用。我添加addSelect和更改了orderBy部分。

$vtpQb = $entityManager->createQueryBuilder();
            $vtpQb
            ->from("AppBundle:TrPlace","trplace")
            ->select($view_fectch_fields)
            ->addSelect('(CASE WHEN vwpm.tagStatusValue = 3 THEN 1 ELSE 0 END) AS HIDDEN ordCol')
            ->join('AppBundle:TrVwPlacePrivateMarkers', 'vwpm','WITH','trplace.id = vwpm.placeId')
            ->where('vwpm.userid = :userid')
            ->setParameter("userid",$userid)
            ->orderBy('ordCol', 'DESC');
Run Code Online (Sandbox Code Playgroud)

请注意HIDDEN中的关键字addSelect。没有它就无法工作。