Похоже, что 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
Создайте модель
Объявите таблицу $ именем вашего представления.
Создайте метод, который создает (или заменяет) Посмотреть. Это происходит в первый раз для его создания и последующих обновлений.
Вызовите метод Model, который создает представление
Использование модели в вашем нумерацией страниц. (Теперь он указывает на вид).
Вероятно, это не лучшая идея, но она как бы соответствует тому, как она хочет работать.
Я пробовал «стандартные» способы, но они не хотели играть красиво. Я также использовал большинство базовых c функциональных возможностей CI SQL, вы можете использовать builder et c, если хотите.
Надеюсь, это даст вам некоторые идеи.