Code Igniter 4 По умолчанию нумерация страниц с использованием класса модели не имеет порядка и присоединяется - PullRequest
2 голосов
/ 26 апреля 2020
$postModel = new \App\Models\PostModel();
$pager = \Config\Services::pager();
$post = $postModel->orderBy('dteCreatedDate', 'DESC')->findAll();
$data = [
        'post' => $postModel->paginate(2,'post'),
        'pager' => $postModel->pager
     ];

У меня есть код выше для создания нумерации страниц SimpleLink в моем проекте воспламенителя кода 4. Эта нумерация страниц работает, но ей не хватает 1 информации и порядка следования результата.

Мне нужно выбрать столбец из другой таблицы, который подключается к таблице в PostModel. Как добавить объединение и порядок в $postModel, чтобы я мог получить все необходимые мне данные и иметь порядок в наборе результатов.

результат передается в pagination() из Класс модели по умолчанию разбит на страницы, поэтому я хотел использовать эту функцию

Как добавить объединение и порядок в класс модели. По умолчанию CRUD

1 Ответ

1 голос
/ 26 апреля 2020

Похоже, что paginate работает непосредственно с таблицей, объявленной в модели, то есть с тем, что объявлено в защищенном $ table = 'table_name'.

Итак, я подумал: если вам нужно использовать JOIN на одном или несколько таблиц и некоторые другие вещи, "способ" обойти это - создать таблицу VIEW.

Я поиграл с этим и придумал какой-то рабочий код. Это довольно тривиально, но, кажется, это подтверждает суть.

У меня есть две таблицы. (очень слабо на основе Cluedo и недостатка сна)

Таблица 1

table_1
   id,
   name,
   type

with inserted data of
1, Fred, Baker
2, Sam , Candle Stick Maker

Таблица 2

table_2
   id,
   place

with inserted data of
1, Laundry
2, Bathroom

В PostModel у меня есть

protected $table = 'table_view';

/**
 * Only need to create the View so the pagination can access it via
 * $this->table (protected $table = 'table_view')
 */
public function create_view() {
    $sql = "CREATE OR REPLACE VIEW table_view AS ";
    // Whatever your SQL needs to be goes here
    $sql .= "SELECT t1.name, t1.type, t2.place FROM table_2 t2 
        JOIN table_1 t1 on t1.id = t2.table_1_id";
    echo $sql;
    $query = $this->db->query($sql);
}

Тогда ваш метод Paginate может стать

public function index() {
    $postModel = new \App\Models\PostModel();
    $postModel->create_view();
    $pager = \Config\Services::pager();
    $data = [
        'posts' => $postModel->paginate(2),
        'pager' => $postModel->pager
    ];

    echo view('users_view', $data);
}

My View is

<code><h2> The results</h2>

<?php
echo '<pre>';
echo 'LINE: ' . __LINE__ . ' Module ' . __CLASS__ . '<br>';
var_dump($posts);
echo '
'; ?>

, который дает вывод (и я не включил нумерацию страниц, но я проверял его)

CREATE OR REPLACE VIEW table_view AS SELECT t1.name, t1.type, t2.place FROM table_2 t2 JOIN table_1 t1 on t1.id = t2.table_1_id
The results
LINE: 10 Module 
array(2) {
  [0]=>
  array(3) {
    ["name"]=>
    string(4) "Fred"
    ["type"]=>
    string(5) "Baker"
    ["place"]=>
    string(7) "Laundry"
  }
  [1]=>
  array(3) {
    ["name"]=>
    string(3) "Sam"
    ["type"]=>
    string(18) "Candle Stick Maker"
    ["place"]=>
    string(8) "Bathroom"
  }
}
Fred    Baker   Laundry
Sam Candle Stick Maker  Bathroom

"Похоже", что имя таблицы в в этом случае наличие несуществующей таблицы (до ее создания) не приводит к нарушению установки таблицы $ Model для несуществующей таблицы.

Summary

  1. Создайте модель

  2. Объявите таблицу $ именем вашего представления.

  3. Создайте метод, который создает (или заменяет) Посмотреть. Это происходит в первый раз для его создания и последующих обновлений.

  4. Вызовите метод Model, который создает представление

  5. Использование модели в вашем нумерацией страниц. (Теперь он указывает на вид).

Вероятно, это не лучшая идея, но она как бы соответствует тому, как она хочет работать.

Я пробовал «стандартные» способы, но они не хотели играть красиво. Я также использовал большинство базовых c функциональных возможностей CI SQL, вы можете использовать builder et c, если хотите.

Надеюсь, это даст вам некоторые идеи.

...