helldweller
@helldweller
PornOps

MsSQL в Yii2. Как правильно сортировать данные?

В ООП не силен. 10лет назад кодил на PHP структурно :)
Начал вот изучать ООП и Yii2
#MSSQL2008 via freeTDS7.3 @linux

<?php
namespace frontend\models;
use yii\db\ActiveRecord;
class Plist extends ActiveRecord
{
    public static function getDb()
    {
        return \Yii::$app->db2;  
    }
    public static function tableName() {
         return 'dbo.pList';
    }
}
?>

$pList = Plist::find()
    ->select('ID, Name, FirstName, MidName, WorkPhone, HomePhone, BirthDate')
	->filterWhere(['like', 'Name', $searchQuery])
	//->orderBy('Name')
	//->all()
	;
	
Хочу дальше работать с результатом так:

<?php foreach ($pList as $t) { ?>
    <li><?=$t->Name."&nbsp;".$t->FirstName."&nbsp;".$t->MidName?></li>
<?php } ?>

так вот если я пытаюсь добавить сортировку вылетает ошибка
SQLSTATE[HY000]: General error: 20018 Column "dbo.pList.Name" is invalid in the ORDER BY clause because it is not contained in either an aggregate function or the GROUP BY clause. [20018] (severity 16) [(null)]
The SQL being executed was: SELECT COUNT(*) FROM [dbo].[pList] ORDER BY [Name]


->groupBy() не вносит ясности

Хотя если писать запрос руками SELECT * FROM [dbo].[pList] ORDER BY [Name] - работает норм
Yii в построителе запросов добавляет COUNT(*) - с ним не работает.

UPD*1: В итоге получается, что yii создает такой запрос:
SELECT COUNT(*) FROM (SELECT [ID], [Name] FROM [dbo].[pList] GROUP BY [ID], [Name] ORDER BY [Name])
а надо что-то вроде:
SELECT [ID], [Name], COUNT(*) FROM [dbo].[pList] GROUP BY [ID], [Name] ORDER BY [Name]

При этом если использую метод ->all() -то запрос отрабатывает, но возвращается результат в виде массива, а я хочу ActiveQueryInterface

Подскажите как правильно составить запрос?

UPD*2:
Не указал, как оказалось, важный момент!
/*$pagination = new Pagination([
		    'defaultPageSize' => 20,
			'totalCount' => $pList->count()
		]);*/
		//$pList = $pList->offset($pagination->offset)->limit($pagination->limit)->all();

Использовал пагинацию. Каюсь. Закомментил.
И раскомментил //->orderBy('Name')->all()
Сортировка заработала. Без пагинации...

UPD*3: Решено! :)
Добавил orderBy() в пагинацию, там оно и заработало..
$pList = $pList->orderBy($sort->orders)->offset($pagination->offset)->limit($pagination->limit)->all();

Спасибо за наводящие вопросы!!
  • Вопрос задан
  • 232 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы