法尔康 | "belongsTo" 的两个查询中的一个查询
Phalcon | One query insted of two for "belongsTo"
如果模型具有关系 belongsTo,是否可以进行一个 JOIN 查询而不是两个 SELECT 查询?
我的意思是如果有两个模型:
<?php
class Robots extends \Phalcon\Mvc\Model
{
public $id;
public $name;
public $type_id;
public function initialize()
{
$this->belongsTo("type_id", "RobotsTypes", "id");
}
}
和
<?php
class RobotsTypes extends \Phalcon\Mvc\Model
{
public $id;
public $type;
}
我正在尝试获取机器人类型:
$robot = Robots::findFirst(2);
echo $robot->RobotsTypes->type;
然后 Phalcone 进行两次 SELECT-查询:
150312 14:41:02 49 Connect robots@localhost on robots
49 Query SELECT IF(COUNT(*)>0, 1 , 0) FROM `INFORMATION_SCHEMA`.`TABLES` WHERE `TABLE_NAME`='robots'
49 Query DESCRIBE `robots`
49 Query SELECT `robots`.`id`, `robots`.`name`, `robots`.`type_id` FROM `robots` WHERE `robots`.`id` = '2' LIMIT 1
49 Query SELECT IF(COUNT(*)>0, 1 , 0) FROM `INFORMATION_SCHEMA`.`TABLES` WHERE `TABLE_NAME`='robot_types'
49 Query DESCRIBE `robot_types`
49 Query SELECT `robot_types`.`id`, `robot_types`.`type` FROM `robot_types` WHERE `robot_types`.`id` = '2' LIMIT 1
49 Quit
是否可以让 Phalcon 使用 JOIN 只执行 1 个查询?
SELECT `robots`.`id`, `robots`.`name`, `robots`.`type_id`, `robot_types`.`id`, `robot_types`.`type` FROM `robots` JOIN `robot_types` ON `robots`.`type_id` = `robot_types`.`id` WHERE `robots`.`id` = '2' LIMIT 1
我知道使用视图可以解决问题。但是它需要创建一个视图和一个模型。
是否可以在不使用 PHQL 的情况下仅在 Phalcone 中执行此操作?例如,通过在 belongsTo 方法中指定附加参数?
类似
谢谢:)
$queryBuilder = $this->getDI()->getModelsManager()
->createBuilder()
->columns(['r.id','r.name', 'r.type_id', 'rt.type'])
->addFrom('Robot', 'r')
->leftJoin('RobotTypes', 'rt.id = r.type_id', 'rt');
$resultSet = $queryBuilder->getQuery()->execute();//->toArray(); //optional
如果您按名称调用所需的所有列,您应该能够检索完整结果 w/o 分别针对类型进行多查询 DB。它仍然不是 PHQL,它也不需要 belongsTo()
的声明即可正常工作。
据我所知,您无法仅使用模型来获取可连接的东西 - 这是因为在多关系表的情况下实现会过于复杂,而这正是 queryBuilder
的设计目的。
如果模型具有关系 belongsTo,是否可以进行一个 JOIN 查询而不是两个 SELECT 查询?
我的意思是如果有两个模型:
<?php
class Robots extends \Phalcon\Mvc\Model
{
public $id;
public $name;
public $type_id;
public function initialize()
{
$this->belongsTo("type_id", "RobotsTypes", "id");
}
}
和
<?php
class RobotsTypes extends \Phalcon\Mvc\Model
{
public $id;
public $type;
}
我正在尝试获取机器人类型:
$robot = Robots::findFirst(2);
echo $robot->RobotsTypes->type;
然后 Phalcone 进行两次 SELECT-查询:
150312 14:41:02 49 Connect robots@localhost on robots
49 Query SELECT IF(COUNT(*)>0, 1 , 0) FROM `INFORMATION_SCHEMA`.`TABLES` WHERE `TABLE_NAME`='robots'
49 Query DESCRIBE `robots`
49 Query SELECT `robots`.`id`, `robots`.`name`, `robots`.`type_id` FROM `robots` WHERE `robots`.`id` = '2' LIMIT 1
49 Query SELECT IF(COUNT(*)>0, 1 , 0) FROM `INFORMATION_SCHEMA`.`TABLES` WHERE `TABLE_NAME`='robot_types'
49 Query DESCRIBE `robot_types`
49 Query SELECT `robot_types`.`id`, `robot_types`.`type` FROM `robot_types` WHERE `robot_types`.`id` = '2' LIMIT 1
49 Quit
是否可以让 Phalcon 使用 JOIN 只执行 1 个查询?
SELECT `robots`.`id`, `robots`.`name`, `robots`.`type_id`, `robot_types`.`id`, `robot_types`.`type` FROM `robots` JOIN `robot_types` ON `robots`.`type_id` = `robot_types`.`id` WHERE `robots`.`id` = '2' LIMIT 1
我知道使用视图可以解决问题。但是它需要创建一个视图和一个模型。
是否可以在不使用 PHQL 的情况下仅在 Phalcone 中执行此操作?例如,通过在 belongsTo 方法中指定附加参数?
类似
谢谢:)
$queryBuilder = $this->getDI()->getModelsManager()
->createBuilder()
->columns(['r.id','r.name', 'r.type_id', 'rt.type'])
->addFrom('Robot', 'r')
->leftJoin('RobotTypes', 'rt.id = r.type_id', 'rt');
$resultSet = $queryBuilder->getQuery()->execute();//->toArray(); //optional
如果您按名称调用所需的所有列,您应该能够检索完整结果 w/o 分别针对类型进行多查询 DB。它仍然不是 PHQL,它也不需要 belongsTo()
的声明即可正常工作。
据我所知,您无法仅使用模型来获取可连接的东西 - 这是因为在多关系表的情况下实现会过于复杂,而这正是 queryBuilder
的设计目的。