Laravel Eloquent, как мне начать вывод данных из середины набора результатов? - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть таблица (название модели: Данные):

Id  Data1  Data2
1   A      ...
2   B      ...
3   C      ...
...
...
...
24  X      ...
25  Y      ...
26  Z      ...

И запрос в Eloquent для извлечения данных:

$datum = Data::orderBy("data1")->paginate(10);

Сейчас запрос всегда начинается ссверху с «A» и проходит через все 3 страницы до «Z», что хорошо, когда пользователь первоначально нажимает на экран. Если пользователь редактирует id = 15 data1 = "o", как мне перезапустить список с идентификатором 15 или страницей 2 вместо того, чтобы вернуться к началу списка?

Ответы [ 4 ]

1 голос
/ 07 ноября 2019

Вы можете использовать четвертый параметр

$datum = Data::orderBy("data1")->paginate(10, ['*'], 'page', 2);

2 - номер страницы

1 голос
/ 07 ноября 2019

Я бы предложил использовать методы пропуска / взятия Laravel :

Быстрый ответ:

$count = 26; 
$skip = 15;
$limit = $count - $skip;
$datum = Data::orderBy("data1")->skip($skip)->take($limit)->get(); 

Объяснение:

1) Сначала подсчитайте строки:

$count = Data::count(); 
// OR
$count = 26; // In your case (alphabet letters) you can set $count directly to 26

2) Затем установите количество пропускаемых строк( или получите его из параметров запроса, чтобы пользователи могли редактировать форму )

$skip = 15;
// OR
$skip = $request->input('id'); // get it from a query parameter set by the user

3) Рассчитать количество оставшихся строк ( всете, которые вы собираетесь получить )

$limit = $count - $skip;

4) Наконец, соберите данные, пропустив 15 первых

$datum = Data::orderBy("data1")->skip($skip)->take($limit)->get(); 
// be aware that you can not paginate when using skip/take
0 голосов
/ 10 ноября 2019

Спасибо Dry7, Giorgio.dev и PhilMarc. Вы все дали мне часть ответа. Окончательное решение будет намного сложнее. Это связано с изменениями в расчете страницы из-за порядка сортировки таблицы (любой из четырех столбцов) и количества отфильтрованных записей (любой из трех столбцов). В дополнение к очистке фильтра, если новая или отредактированная запись выходит за пределы фильтра. Последняя копия таблицы и мой код (который позволяет мне сохранять страницы, предоставляемые Laravel) выглядят следующим образом:

mysql> show columns from mailing_classes;
+--------------------+---------------------+------+-----+---------+----------------+
| Field              | Type                | Null | Key | Default | Extra          |
+--------------------+---------------------+------+-----+---------+----------------+
| id                 | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| mailing_class_code | char(2)             | NO   | UNI | NULL    |                |
| description        | varchar(255)        | NO   |     | NULL    |                |
| created_by_id      | bigint(20) unsigned | NO   | MUL | NULL    |                |
| last_editted_by_id | bigint(20) unsigned | NO   | MUL | NULL    |                |
| created_at         | timestamp           | YES  |     | NULL    |                |
| updated_at         | timestamp           | YES  |     | NULL    |                |
+--------------------+---------------------+------+-----+---------+----------------+

public function index()
{

    $mailingClassSortOrder = session('mailingClassSortOrder');
    $mailingClassRestartValue = session('mailingClassRestartValue');
    $mailingClassSearchLeft = session('mailingClassSearchLeft');
    $mailingClassSearchRight = session('mailingClassSearchRight');
    $rows = 1;
    $page = 0;
    $restart = 0;
    $mcCode = '';
    $mcDescription = '';
    $mcUpdatedAt = '';

    if ($mailingClassRestartValue > 0) {
        $restartRows = MailingClass::where('id', '=', $mailingClassRestartValue)->get();
        foreach ($restartRows as $restartRow) {
            $mcCode = $restartRow->mailing_class_code;
            $mcDescription = $restartRow->description;
        }
        // if restart value does not appear in the filter then clear the filter
        // {deleted for sake of space}
        // find row position based on sort order
        if ($mailingClassSortOrder === "mailing_class_code") {
            // sorted by mailing_class_code column
            $rows = MailingClass::where('mailing_class_code', '<=', $restartRow->mailing_class_code)->count();
        } elseif ($mailingClassSortOrder === "id") {
            // sorted by id column
            $rows = MailingClass::where('id', '<=', $restartRow->id)->count();
        } elseif ($mailingClassSortOrder === "description") {
            // sorted by description column
            $rows = MailingClass::where('description', '<=', $restartRow->description)->count();
        } elseif ($mailingClassSortOrder === "updated_at") {
            // sorted by updated_at column
            $rows = MailingClass::where('updated_at', '<=', $restartRow->updated_at)->count();
        }
    }
    // calculate what should be the current page
    $page = intval($rows / 10) + 1;

    $searchText = '';
    $mailingClasses = [];
    if ($mailingClassSearchLeft === '') {
        if ($mailingClassRestartValue <= 0) {
            $mailingClasses = MailingClass::orderBy($mailingClassSortOrder)->paginate(10);
        } else {
            $mailingClasses = MailingClass::orderBy($mailingClassSortOrder)->paginate(10, ['*'], 'page', $page);
        }

    } elseif ($mailingClassSearchLeft === 'id') {
        // {deleted for sake of space}
    } elseif ($mailingClassSearchLeft === 'mailing_class_code') {
        // {deleted for sake of space}
    } elseif (session('mailingClassSearchLeft') === 'mailing_class_description') {
        // {deleted for sake of space}
    } else {
        // {deleted for sake of space}
    }

    return view(
        'maintenance.mailingclass.index',
        compact('mailingClasses', 'mmsGlobal', 'searchText')
    );
}

Я вынул много кода, связанного с созданием фильтров, чтобы попытатьсясделать как можно более краткимНадеюсь, я не слишком много удалил. Теперь вопрос в том, как мне его оптимизировать.

0 голосов
/ 07 ноября 2019

Согласно Документация Laravel вы можете использовать page строку запроса в вашем URL, чтобы указывать на определенную страницу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...