Phalcon查询语言(PHQL)

它允许用户实现类似于SQL查询语言的查询语言。 PHQL被实现为连接到RDBMS的解??析器。 Phalcon解析器使用与SQLite相同的技术。
PHQL包含以下功能:

  • 它使用绑定参数保护代码。
  • 它通过在每个调用中执行一条SQL语句来防止注入。
  • 它忽略所有大多数在SQL注入中使用的注释。
  • 它仅允许执行数据操作语句。
PHQL生命周期 PHQL使开发人员能够相应地进行个性化和自定义。以下是执行的PHQL语句的生命周期:
  • 解析PHQL, 并将其转换为中间表示(IR)。 IR与数据库系统的SQL实现无关。
  • 根据数据库系统将IR转换为有效的SQL。
  • PHQL语句被解析一次并缓存在内存中。相同语句的进一步执行将导致执行速度稍快。
实作
前端
首先, 我们创建一个接受输入的前端。
我们有2个模型手机和品牌:
< ?phpuse 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下创建。
< ?phpuse 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)

文章图片
结果类型
结果类型分为简单和复杂两种, 具体取决于我们查询的列的类型。
如果我们检索单个对象, 则对象返回为简单结果(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查询语言(PHQL)】如果我们一次访问完整的对象和标量, 则返回复杂结果(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"; }

    推荐阅读