通过加入

时间:2017-10-06 13:10:22

标签: php mysql sql propel

我有这样的查询

$packages = PackageQuery::create()
            ->joinPackageHasTable()
            ->addAscendingOrderByColumn(' CASE name
                  WHEN package.package_id=3 THEN 0
                  ELSE - 1
               END')
            ->groupByName()
            ->find();

我尝试实现的是保持此查询并将ID等于3的前进行转到顶部。 此查询无法正常工作并返回

  

标准:(错误:无法为未定义的表获取TableMap:CASE名称   包裹时。)

表包存在于数据库和模式

1 个答案:

答案 0 :(得分:0)

你不能用推进器这种方式订购。首先,您必须使用别名选择要订购的任何内容,然后您可以订购它。 addAscendingOrderByColumn将检查所请求的列是否为propel所知,并且无法识别自定义sql。

例如,在我自己的项目中,我使用以下代码:

        $query->withColumn(
            'ISNULL(' . BlaBlaTableMap::COL_MIN_LEFT . ')',
            'not_unlimited'
        );
        $query->orderBy('not_unlimited');

在你的情况下,我认为这样的事情会起作用:

        $packages = PackageQuery::create()
            ->withColumn(
                sprintf(
                    'CASE WHEN %s = 3 THEN -1 ELSE 0 END',
                    PackageHasTableTableMap::COL_PACKAGE_ID
                ),
                'is_not_three'
            )
            ->orderBy('is_not_three')
            ->usePackageHasTableQuery()
            ->endUse()
            ->groupByName()
            ->find();