Переместитесь на один ряд вверх в Propel с помощью join

У меня такой запрос

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

То, что я пытаюсь добиться, это сохранить этот запрос и переслать строку с идентификатором, равным 3 до верха. Этот запрос не работает и возвращает

Критерии:(Ошибка: Невозможно извлечь TableMap для неопределенной таблицы: имя CASE, КОГДА пакет.)

пакет таблиц существует как в базе данных, так и в схеме

1 ответ

Вы не можете заказать таким образом, используя Propel. Сначала вы должны выбрать все, что вы хотите заказать с псевдонимом, а затем вы можете заказать это. 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();
Другие вопросы по тегам