如何在不是 ORM 的 cakephp3 中创建模型?

How do I create a model in cakephp3 which is not ORM?

我正在尝试在 CakePHP3.0 中创建一个模型,它允许我按名称检查视图是否存在,如果存在,则获取该视图中的列名。

在 src/model/table 我创建了一个 ViewQuerier.php 文件:

<?php

namespace App\Model\Table;

use Cake\Datasource\ConnectionManager;

class ViewQuerier {

    public function checkViewExists($viewName = null) {
        $connection = ConnectionManager::get('default');

        if ( $viewName == null ) {
            return false;
        }
        $sql = "SELECT TABLE_NAME
                FROM information_schema.tables
                WHERE TABLE_TYPE like 'VIEW' AND TABLE_SCHEMA = database() 
                                             AND TABLE_NAME = :VIEW_NAME";

        $result = $connection()
                ->execute( $sql, ['VIEW_NAME' => $viewName ] )
                ->fetch('assoc');

        if (count($result))
        {
            $sql = "SHOW COLUMNS FROM :VIEW_NAME";

            return $connection()
                ->execute($sql, ['VIEW_NAME' => $viewName ] )
                ->fetch('assoc');
        }

        return false;
    }

}

在控制器中我加载了以下模型:

public function initialize()
{
    $this->loadComponent('RequestHandler');
    $this->loadModel('ViewQuerier');
}

然后像这样调用方法:

public function view($viewname)
{
    $this->viewName = $viewname;
    $this->ViewQuerier->checkViewExists($this->viewName);
} 

我得到的错误是:

未知方法"checkViewExists"

我做错了什么?

谢谢,

这不是可以使用 loadModel() 加载的 "model" (table),它只是恰好位于 Model\Table 中的 class命名空间。

首先,我建议你把 class 放在其他地方,它不是 table class,它与模型层松散相关,只提供实用功能,一些东西Model\Utility 可能是个更好的地方。

也就是说,您只需像使用其他任何东西一样使用它 class 并手动实例化它。

use App\Model\Utility\ViewQuerier;

// ...

$viewQuerier = new ViewQuerier();
$viewQuerier->checkViewExists($this->viewName);

附带说明一下,鉴于该方法实际上不涉及实例,您可以将其设为静态。