【问题标题】:Code Igniter 4 Default pagination using Model Class has no order by and JoinCodeigniter 4 使用模型类的默认分页没有 order by 和 Join
【发布时间】:2020-08-09 19:18:32
【问题描述】:
$postModel = new \App\Models\PostModel();
$pager = \Config\Services::pager();
$post = $postModel->orderBy('dteCreatedDate', 'DESC')->findAll();
$data = [
        'post' => $postModel->paginate(2,'post'),
        'pager' => $postModel->pager
     ];

我有上面的代码在我的代码点火器 4 项目中创建一个 simpleLink 分页。此分页有效,但缺少 1 条信息和结果的顺序。

我需要从连接到 PostModel 中的表的另一个表中选择一列。 如何向$postModel 添加连接和排序,以便我可以获取所需的所有数据并对结果集进行排序。

模型类的pagination() 的结果默认是分页的,这就是我想使用这个函数的原因

如何向模型类默认 CRUD 添加连接和排序

【问题讨论】:

    标签: class model pagination codeigniter-4


    【解决方案1】:

    分页似乎直接作用于模型中声明的表,即在受保护的 $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);
    }
    

    我的观点是

    <h2> The results</h2>
    
    <?php
    echo '<pre>';
    echo 'LINE: ' . __LINE__ . ' Module ' . __CLASS__ . '<br>';
    var_dump($posts);
    echo '</pre>';
    ?>
    
    <table>
        <?php foreach ($posts as $post): ?>
            <tr>
                <td><?= $post['name']; ?></td>
                <td><?= $post['type']; ?></td>
                <td><?= $post['place']; ?></td>
            </tr>
        <?php endforeach; ?>
    </table>
    

    这给出了(我没有包括分页但我确实测试过)的输出

    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
    

    它“看起来”表名,在这种情况下是一个不存在的表(直到它被创建)不会破坏模型的 $table 被设置为一个不存在的表。

    总结

    1. 创建模型

    2. 将 $table 声明为您的视图名称。

    3. 创建一个创建(或替换)视图的方法。 这大约是第一次创建它和后续更新。

    4. 调用创建视图的Model方法

    5. 在您的分页中使用模型。 (它现在指向视图)。

    这可能不是最好的想法,但它有点适合它想要的工作方式。

    我尝试过“标准”方式,但他们不想玩得很好。 我还使用了最基本的 CI SQL 功能,如果您愿意,可以使用构建器等。

    我希望这能给你一些想法。

    【讨论】:

    • 我从来没有想过这个。我仍然试图了解它是怎么回事,但我看起来真的很棒。答案没有顺序,但我这样做是为了我的,没关系。我刚刚开始了解这个模型类,并且一遍又一遍地阅读您的答案以了解 PostModel 中发生了什么。 ` 关于创建视图的目的` 顺便说一句,是否可以覆盖默认表名?
    • @guradio 随心所欲。我只是使用了一个简单的 Join 来演示带有可疑表和字段名称的概念......
    • 我的意思是默认表被覆盖了对吧?因为现在默认表是视图,所以除非我创建另一个视图,否则我不能将默认 CRUD 用于其他选择?我只是想知道这并不重要。
    • @guradio 这就是我有点虚张声势的地方,看起来它只需要一个名字,否则它会感到不安。您可以在那里使用任意数量的其他表格来做任何您想做的事情。似乎这与某些“新功能”(即分页)有关。我只是使用它们,直到我变得更好 - 与我在 CI 3 中使用的方式接近。
    • 非常感谢。这个解决方案对我帮助很大。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-31
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2019-04-25
    • 1970-01-01
    相关资源
    最近更新 更多