SqlDataProvider пагинация, offset

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
Chelobaka
Сообщения: 60
Зарегистрирован: 2018.06.01, 09:54

SqlDataProvider пагинация, offset

Сообщение Chelobaka » 2019.03.13, 00:11

Пользуюсь SqlDataProvider. Когда решил проверить пагинацию наткнулся что она не работает. Попробовал добавить OFFSET в SQL запросы, но к SQL запросу сама собой клеится LIMIT 2 в конце строки. OFFSET в этом случае не работает.
Как добавлять OFFSET? Возможно он должен автоматически добавляться?

Основная страница без параметров пагинации

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

http://3.com/web/index.php?r=doctor%2Fview&id=1

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

SQL Request
SELECT DISTINCT (patient.id) as patient_id, 
                        capitation, 
                        first_name, 
                        last_name, 
                        status, 
                        denial_reason, 
                        date 
                        FROM Patient 
                        LEFT JOIN `payment` 
                        ON `payment`.`patient_id` = `patient`.`id` 
                        WHERE `patient`.`doctor_id`= '1' 
                        AND date BETWEEN '2019-02-01' AND '2019-02-28'  LIMIT 2
 
Переход на 2ую страницу
date=2019-Feb - параметр для SQL запроса

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

http://3.com/web/index.php?r=doctor%2Fview&id=1&date=2019-Feb&page=2&per-page=2

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

SELECT DISTINCT (patient.id) as patient_id, 
                        capitation, 
                        first_name, 
                        last_name, 
                        status, 
                        denial_reason, 
                        date 
                        FROM Patient 
                        LEFT JOIN `payment` 
                        ON `payment`.`patient_id` = `patient`.`id` 
                        WHERE `patient`.`doctor_id`= '1' 
                        AND date BETWEEN '2019-02-01' AND '2019-02-28'  LIMIT 2
                        
Переход на 1ую страницу

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

http://3.com/web/index.php?r=doctor%2Fview&id=1&date=2019-Feb&page=1&per-page=2

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

SELECT DISTINCT (patient.id) as patient_id, 
                        capitation, 
                        first_name, 
                        last_name, 
                        status, 
                        denial_reason, 
                        date 
                        FROM Patient 
                        LEFT JOIN `payment` 
                        ON `payment`.`patient_id` = `patient`.`id` 
                        WHERE `patient`.`doctor_id`= '1' 
                        AND date BETWEEN '2019-02-01' AND '2019-02-28'  LIMIT 2
                        
Сам провайдер данных.

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

$count = Yii::$app->db->createCommand('
            SELECT COUNT(*) 
            FROM Patient, Payment 
            WHERE Patient.doctor_id=:doctor_id 
            AND `payment`.`patient_id` = `patient`.`id` 
            AND date BETWEEN :start AND :end
            ',
            [':doctor_id' => 1, ':start' =>  $form->getBeginDate(), ':end' =>  $form->getEndDate()])->queryScalar();

        $provider = new SqlDataProvider([
            'sql' => 'SELECT DISTINCT (patient.id) as patient_id, 
                        capitation, 
                        first_name, 
                        last_name, 
                        status, 
                        denial_reason, 
                        date 
                        FROM Patient 
                        LEFT JOIN `payment` 
                        ON `payment`.`patient_id` = `patient`.`id` 
                        WHERE `patient`.`doctor_id`= :doctor_id 
                        AND date BETWEEN :start AND :end ',
            'params' => [':doctor_id' =>  $id, ':start' =>  $form->getBeginDate(), ':end' =>  $form->getEndDate(),],
            'totalCount' => $count,
            'pagination' => [
                'pageSize' => 2,
                'params'=>[
                    'id' => $id,
                    'date' => $form->getMonth(),
                ],

            ],
        ]);

Аватара пользователя
Chelobaka
Сообщения: 60
Зарегистрирован: 2018.06.01, 09:54

Re: SqlDataProvider пагинация, offset

Сообщение Chelobaka » 2019.03.17, 10:41

Аналог:

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

$provider = new ActiveDataProvider([
            'query' => Patient::find()
                    ->joinWith('payments p', false)
                    ->where(['doctor_id' => 1])
                    ->andWhere(['between', 'p.date', $form->getBeginDate(), $form->getEndDate()]),
            'pagination' => [ 'pageSize' => 2 ],
        ]);

Аватара пользователя
SiZE
Сообщения: 2690
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

Re: SqlDataProvider пагинация, offset

Сообщение SiZE » 2019.03.17, 19:09

Chelobaka писал(а):
2019.03.13, 00:11
но к SQL запросу сама собой клеится LIMIT 2 в конце строки

Сам провайдер данных.

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

                'pageSize' => 2,
:?:
в поиске работы

Аватара пользователя
Chelobaka
Сообщения: 60
Зарегистрирован: 2018.06.01, 09:54

Re: SqlDataProvider пагинация, offset

Сообщение Chelobaka » 2019.03.19, 17:21

SiZE писал(а):
2019.03.17, 19:09
Chelobaka писал(а):
2019.03.13, 00:11
но к SQL запросу сама собой клеится LIMIT 2 в конце строки

Сам провайдер данных.

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

                'pageSize' => 2,
:?:
А как еще проверить работу пагинации если записи у тебя всего 3?

Ответить