Query union + order by + limit

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Koudy
Сообщения: 21
Зарегистрирован: 2014.02.27, 16:33

Query union + order by + limit

Сообщение Koudy »

Как использовать такую связку union + order by + limit?
Необходимо задать лимит для всех строк, возвращаемых запросом с union, а не для каждого запроса в отдельности, т.е. добавить в самый конец запроса, после объединений.
Koudy
Сообщения: 21
Зарегистрирован: 2014.02.27, 16:33

Re: Query union + order by + limit

Сообщение Koudy »

Вопрос снят, вот решение:
$query->from(['a' => $unionQuery])->limit(10)
cvl
Сообщения: 25
Зарегистрирован: 2015.03.02, 08:42
Контактная информация:

Re: Query union + order by + limit

Сообщение cvl »

Koudy
Спасибо за решение! Как раз такая проблема возникла.
AlexCereus
Сообщения: 13
Зарегистрирован: 2017.02.09, 21:06

Re: Query union + order by + limit

Сообщение AlexCereus »

А можно чуть более подробнее.
Использую orderBy, но получаю все строки из второй из второго запроса внизу.
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Query union + order by + limit

Сообщение andku83 »

Код: Выделить всё

$query->from(['a' => $unionQuery])->orderBy([...])->limit(10)
AlexCereus
Сообщения: 13
Зарегистрирован: 2017.02.09, 21:06

Re: Query union + order by + limit

Сообщение AlexCereus »

Спасибо. Если я правильно понял, то надо создать отдельно запрос класса Query.
А не подскажите тогда, как правильно создать ActiveDataProvider?

Код: Выделить всё

$dataProvider = new ActiveDataProvider([
     'query' => $query,
]);
С таким запросом в датапровайдере получается не множество объектов, а множество массивов.
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Query union + order by + limit

Сообщение andku83 »

Уточните что у вас в $query.
Возможно там и объекты (к ActiveRecord можно обращаться как к массиву), как вы определили что там массивы?
AlexCereus
Сообщения: 13
Зарегистрирован: 2017.02.09, 21:06

Re: Query union + order by + limit

Сообщение AlexCereus »

Изначально было примерно так:

Код: Выделить всё

$query1 = ActionMark::find()->select("id, userId, markValue, date");
        
$query2 = Orders::find()->select(['id', 'userId', 'sertNominal as markValue','date']);
                
$query = $query1->union($query2)->orderBy(['date'=>SORT_ASC]);

$dataProvider = new ActiveDataProvider([
    'query' => $query,
]);
print_r($dataProvider->models):

Код: Выделить всё

Array
(
    [0] => app\models\ActionMark Object
        (
            [lineType] => 
            [_attributes:yii\db\BaseActiveRecord:private] => Array
                (
                    [id] => 50
                    [userId] => 38
                    [markValue] => 15000
                    [date] => 2018-09-02 12:47:51
                )

            [_oldAttributes:yii\db\BaseActiveRecord:private] => Array
                (
                    [id] => 50
                    [userId] => 38
                    [markValue] => 15000
                    [date] => 2018-09-02 12:47:51
                )

            [_related:yii\db\BaseActiveRecord:private] => Array
                (
                )

            [_relationsDependencies:yii\db\BaseActiveRecord:private] => Array
                (
                )

            [_errors:yii\base\Model:private] => 
            [_validators:yii\base\Model:private] => 
            [_scenario:yii\base\Model:private] => default
            [_events:yii\base\Component:private] => Array
                (
                )

            [_eventWildcards:yii\base\Component:private] => Array
                (
                )

            [_behaviors:yii\base\Component:private] => Array
                (
                )

        )
        ....
)
Но почему то не срабатывал orderBy. Если я правильно понял, то переделал:

Код: Выделить всё

$query1 = ActionMark::find()->select("id, userId, markValue, date");
        
$query2 = Orders::find()->select(['id', 'userId', 'sertNominal as markValue','date']);
                
$unionQuery = $query1->union($query2);
        
$query = new Query();
$query->from(['a' => $unionQuery])->orderBy(['date'=>SORT_ASC]);
        
$dataProvider = new ActiveDataProvider([
           'query' => $query,
]);
тогда print_r($dataProvider->models) выдал:

Код: Выделить всё

Array
(
    [0] => Array
        (
            [id] => 50
            [userId] => 38
            [markValue] => 15000
            [date] => 2018-09-02 12:47:51
        )
        ....
)
Обратиться к массиву, как к объекту не получается.

Я правильно понял, вы это просили уточнить?
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Query union + order by + limit

Сообщение andku83 »

А какого класса объекты вы предполагали получить после объединения? (после скрещивания ежа и ужа ;))
Если у вас есть Query классы для ваших объектов, то можете использовать их вместо обычного Query:

Код: Выделить всё

$query = new ActionMarkQuery();
$query->from(['a' => $unionQuery])...
Возможен еще такой вариант:

Код: Выделить всё

$query = ActionMark::find()->from(['a' => $unionQuery])...
AlexCereus
Сообщения: 13
Зарегистрирован: 2017.02.09, 21:06

Re: Query union + order by + limit

Сообщение AlexCereus »

Спасибо, то что нужно.
Ответить