【问题标题】:Phalcon Model ManagerPhalcon 模型管理器
【发布时间】:2014-07-08 23:10:56
【问题描述】:

我正在尝试创建类似的查询

SELECT *
FROM course
where course.id IN(
    SELECT DISTINCT(course_id)
FROM course_timing tim
WHERE tim.date >= CURDATE()
    )

我已经设置了模型管理器

 $di->set('modelsManager', function() {
      return new Phalcon\Mvc\Model\Manager();
    });

但是当我尝试使用时

       $phql = "SELECT * FROM CourseTiming";
       $rows = $this->modelsManager->executeQuery($phql);

我来了

无法加载模型“CourseTiming”

或者有什么方法可以使用 Model::find 等运行上述查询

【问题讨论】:

  • 你有 CourseTiming 模型吗?

标签: php phalcon


【解决方案1】:

PHQL 在查询中使用模型类(不是数据库表名称),因此您应该创建 CourseTiming 模型以通过 PHQL 访问您的数据库表:

<?php

class CourseTiming extends Phalcon\Mvc\Model
{
    public $id;
    ....

    public function getSource()
    {
        return 'course_timing'; // name of db table here
    }
}

不要忘记在 Phalcon 加载器中注册模型目录:

$loader = new \Phalcon\Loader();
$loader->registerDirs(array(
    'pathToModelsDir',
    ...
));
$loader->register();

另一种方法是通过 Phalcon PDO 访问 db(在这种情况下您不需要创建 CourseTiming 模型)。

index.php:

$di->setShared('db', function() {
    $db = new Phalcon\Db\Adapter\Pdo\Mysql(array(
        'host'     => 'localhost',
        'username' => 'root',
        'password' => 'root',
        'dbname'   => 'my_db',
    ));
    return $db;
});

控制器:

$records = $this->db->fetchAll("SELECT * FROM course_timing", Phalcon\Db::FETCH_ASSOC);

【讨论】:

  • 我已经把所有的东西都加载并工作了。后来我意识到如果我使用像 \Ilm\Frontend\Models\CourseTiming 这样的完整路径,它就可以工作。但是如果我只是使用 CourseTiming 它仍然会出现上述错误。
  • 其次请您解释一下setShared和set的区别。并且在不使用 PHQL 的情况下直接获取数据是否有任何缺点。谢谢你
  • 如果您使用模型,那么 PHalcon 将为您构建 PHQL。第二件事是你使用了命名空间模型,所以在这种情况下你必须在 PHQL 中提供命名空间 - 所以在这种情况下使用 Model::find()Model::query()-&gt;andWhere()-&gt;...-&gt;execute() 需要更少的编写。
  • @User707 set() - 每次在 DI 中访问服务时都会创建并返回新实例。 setShared() - 在第一个 DI 请求期间只会创建一个实例,另一个请求将接收这个实例(类似于单例)。
猜你喜欢
  • 1970-01-01
  • 2021-04-05
  • 2019-02-18
  • 2016-04-05
  • 1970-01-01
  • 2016-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多