个性化阅读
专注于IT技术分析

Phalcon查询语言(PHQL)

它允许用户实现类似于SQL查询语言的查询语言。 PHQL被实现为连接到RDBMS的解​​析器。 Phalcon解析器使用与SQLite相同的技术。

PHQL包含以下功能:

  • 它使用绑定参数保护代码。
  • 它通过在每个调用中执行一条SQL语句来防止注入。
  • 它忽略所有大多数在SQL注入中使用的注释。
  • 它仅允许执行数据操作语句。

PHQL生命周期

PHQL使开发人员能够相应地进行个性化和自定义。以下是执行的PHQL语句的生命周期:

  • 解析PHQL, 并将其转换为中间表示(IR)。 IR与数据库系统的SQL实现无关。
  • 根据数据库系统将IR转换为有效的SQL。
  • PHQL语句被解析一次并缓存在内存中。相同语句的进一步执行将导致执行速度稍快。

实作

前端

首先, 我们创建一个接受输入的前端。

我们有2个模型手机和品牌:

<?php
use Phalcon\Mvc\Model;
class Mobile extends Model
{
    public $id;
    public $name;
    public $brand_id;
    public $price;
    public $year;
    /**
     * This model is mapped to the table sample_mobile
     */
    public function getSource()
    {
        return 'sample_mobile';
    }
    /**
     * A mobile only has a Brand, but a Brand have many mobile
     */
    public function initialize()
    {
        $this->belongsTo('brand_id', 'Brands', 'id');
    }
}

class Brands extends Model
{
    public $id;
    public $name;
    /**
     * The model Brands is mapped to the 'sample_brands' table
     */
    public function getSource()
    {
        return 'sample_brands';
    }


    /**
     * A Brand can have many Mobile
     */
    public function initialize()
    {
        $this->hasMany('id', 'Mobile', 'brand_id');
    }

创建PHQL查询

它在目录Phalcon \ Mvc \ Model \ Query下创建。

<?php
use Phalcon\Mvc\Model\Query;
// Instantiate the Query
$query = new Query(
    'SELECT * FROM Mobile', $this->getID()
);
// Execute the query returning a result if any
$mobile = $query->execute();

执行PHQL查询

它是从控制器或视图下的Phalcon \ Mvc \ Model \ Manager下执行的。

<?php
// Executing a simple query
$query = $this->modelsManager->createQuery('SELECT * FROM Mobile');
$mobile = $query->execute();
// With bound parameters
$query = $this->modelsManager->createQuery('SELECT * FROM Mobile WHERE name = :name:');
$mobile = $query->execute(
    [
        'name' => 'Sony', ]
);

输出

Phalcon PHQL 1

结果类型

结果类型分为简单和复杂两种, 具体取决于我们查询的列的类型。

如果我们检索单个对象, 则对象返回为简单结果(Phalcon \ Mvc \ Model \ Resultset \ Simple)。

<?php
// Executing a simple query
$query = $this->modelsManager->createQuery('SELECT * FROM Mobiles);
$mobiles= $query->execute();
// With bound parameters
$query = $this->modelsManager->createQuery('SELECT * FROM Mobiles WHERE name = :name:');
$mobiles  = $query->execute(
    [
        'name' => ?Sony', ]
);

如果我们一次访问完整的对象和标量, 则返回复杂结果(Phalcon \ Mvc \ Model \ Resultset \ Complex)。

<?php
$phql = 'SELECT m.price*0.16 AS taxes, m.* FROM Mobiles AS m ORDER BY m.name';
$result = $manager->executeQuery($phql);
foreach ($result as $row) {
    echo 'Name: ', $row->Mobiles->name, "\n";
    echo 'Price: ', $row-> Mobiles ->price, "\n";
    echo 'Taxes: ', $row->taxes, "\n";
}
赞(0)
未经允许不得转载:srcmini » Phalcon查询语言(PHQL)

评论 抢沙发

评论前必须登录!