如何在不是 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);
附带说明一下,鉴于该方法实际上不涉及实例,您可以将其设为静态。
我正在尝试在 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);
附带说明一下,鉴于该方法实际上不涉及实例,您可以将其设为静态。