Спасибо 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')
);
}
Я вынул много кода, связанного с созданием фильтров, чтобы попытатьсясделать как можно более краткимНадеюсь, я не слишком много удалил. Теперь вопрос в том, как мне его оптимизировать.