Query union + order by + limit
Query union + order by + limit
Как использовать такую связку union + order by + limit?
Необходимо задать лимит для всех строк, возвращаемых запросом с union, а не для каждого запроса в отдельности, т.е. добавить в самый конец запроса, после объединений.
Необходимо задать лимит для всех строк, возвращаемых запросом с union, а не для каждого запроса в отдельности, т.е. добавить в самый конец запроса, после объединений.
Re: Query union + order by + limit
Вопрос снят, вот решение:
$query->from(['a' => $unionQuery])->limit(10)
$query->from(['a' => $unionQuery])->limit(10)
Re: Query union + order by + limit
Koudy
Спасибо за решение! Как раз такая проблема возникла.
Спасибо за решение! Как раз такая проблема возникла.
-
- Сообщения: 13
- Зарегистрирован: 2017.02.09, 21:06
Re: Query union + order by + limit
А можно чуть более подробнее.
Использую orderBy, но получаю все строки из второй из второго запроса внизу.
Использую orderBy, но получаю все строки из второй из второго запроса внизу.
Re: Query union + order by + limit
Код: Выделить всё
$query->from(['a' => $unionQuery])->orderBy([...])->limit(10)
-
- Сообщения: 13
- Зарегистрирован: 2017.02.09, 21:06
Re: Query union + order by + limit
Спасибо. Если я правильно понял, то надо создать отдельно запрос класса Query.
А не подскажите тогда, как правильно создать ActiveDataProvider?
С таким запросом в датапровайдере получается не множество объектов, а множество массивов.
А не подскажите тогда, как правильно создать ActiveDataProvider?
Код: Выделить всё
$dataProvider = new ActiveDataProvider([
'query' => $query,
]);
Re: Query union + order by + limit
Уточните что у вас в $query.
Возможно там и объекты (к ActiveRecord можно обращаться как к массиву), как вы определили что там массивы?
Возможно там и объекты (к ActiveRecord можно обращаться как к массиву), как вы определили что там массивы?
-
- Сообщения: 13
- Зарегистрирован: 2017.02.09, 21:06
Re: Query union + order by + limit
Изначально было примерно так:
print_r($dataProvider->models):
Но почему то не срабатывал orderBy. Если я правильно понял, то переделал:
тогда print_r($dataProvider->models) выдал:
Обратиться к массиву, как к объекту не получается.
Я правильно понял, вы это просили уточнить?
Код: Выделить всё
$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,
]);
Код: Выделить всё
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
(
)
)
....
)
Код: Выделить всё
$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,
]);
Код: Выделить всё
Array
(
[0] => Array
(
[id] => 50
[userId] => 38
[markValue] => 15000
[date] => 2018-09-02 12:47:51
)
....
)
Я правильно понял, вы это просили уточнить?
Re: Query union + order by + limit
А какого класса объекты вы предполагали получить после объединения? (после скрещивания ежа и ужа )
Если у вас есть Query классы для ваших объектов, то можете использовать их вместо обычного Query:
Возможен еще такой вариант:
Если у вас есть Query классы для ваших объектов, то можете использовать их вместо обычного Query:
Код: Выделить всё
$query = new ActionMarkQuery();
$query->from(['a' => $unionQuery])...
Код: Выделить всё
$query = ActionMark::find()->from(['a' => $unionQuery])...
-
- Сообщения: 13
- Зарегистрирован: 2017.02.09, 21:06
Re: Query union + order by + limit
Спасибо, то что нужно.