Phalcon 查询语言


Phalcon查询语言(PHQL)也被称为PhalconQL,是一种高级SQL方言,对Phalcon支持的数据库系统的SQL查询进行标准化。

它包括一个用C语言编写的解析器,用于翻译目标RDBMS中的语法。

以下是Phalcon查询语言的一些突出特点:

  • 为了 Web 应用程序的安全性,它使用绑定参数;

  • 表被视为模型,而列被视为类属性;

  • 所有数据操作语句都用于防止可能发生的数据丢失;

  • 通过一次保留一个 SQL 查询调用来防止 SQL 注入。

创建 PHQL 查询


查询是通过实例化Phalcon\Mvc\Model\Query类创建的。

// 实例化查询
$query = new Query( 
    "SELECT * FROM Users",
    $this->getDI()
);  

// 执行查询返回结果(如果有)
$cars = $query->execute();

在前面的章节中,我们已经看到了名为 blog 教程的脚手架 Web 应用程序的工作,它包括按名称或 slug 搜索类别。

以下是 searchAction 包含的代码:

public function searchAction() {  
    $numberPage = 1;
    if ($this->request->isPost()) {
        $query = Criteria::fromInput($this->di, "Categories", $_POST);
        $this->session->conditions = $query->getConditions();
    } else {
        $numberPage = $this->request->getQuery("page", "int");
        if ($numberPage <= 0) {
            $numberPage = 1;
        }
    }
   
    $parameters = array();
    if ($this->session->conditions) {
        $parameters["conditions"] = $this->session->conditions;
    }
   
    // $parameters["order"] = "id";
    $categories = Categories::find($parameters);
    if (count($categories) == 0) {
        $this->flash->notice("The search did not find any categories");
      
        return $this->dispatcher->forward(array(
            "controller" => "categories",
            "action" => "index"
        ));
    }
   
    $paginator = new \Phalcon\Paginator\Adapter\Model(array(
        "data" => $categories,
        "limit"=> 10,
        "page" => $numberPage
    ));
   
    $page = $paginator->getPaginate();
    $this->view->setVar("page", $page);
}

在控制器中执行的PHQL查询(突出显示)将根据搜索条件获取所有结果,所有符合根据条件的搜索结果将显示在屏幕上,以下是成功执行上述代码后收到的输出:

PHQL

PHQL 生命周期


作为一种高级语言,PHQL 为开发人员提供了根据需求个性化和定制各个方面的能力。

以下是Phalcon中执行的每个PHQL语句的生命周期:

  • 每个 PHQL 语句都被解析和转换为中间表示 (IR),它完全独立于数据库系统实现的 SQL;

  • IR 根据 Web 应用程序中使用的数据库系统转换为 SQL 语句,生成的 SQL 语句与模型相关联;

  • 所有 PHQL 语句都解析一次并缓存在内存中,如果执行相同的语句结果,将有助于提高性能。

Life Cycle