它允许用户实现类似于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 \ 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";
}
评论前必须登录!
注册