Можно ли сделать один 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 выполнить всего 1 запрос с помощью JOIN?
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
Я знаю, что использование представлений может решить проблему. Но для этого нужно создать вид и еще одну модель.
Можно ли сделать это только в Phalcone без использования PHQL? Например, указав аргумент сложения в методе ownTo?
Это похоже на Запросы, связанные с производительностью Phalcon
Спасибо 🙂
$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
Если вы называете по имени все столбцы, которые вам нужны, вы сможете получить полный результат без нескольких запросов к БД для типов отдельно. Это все еще не PHQL, это также не требует деклараций belongsTo()
работать правильно.
Насколько я знаю, вы не можете получать объединяемые вещи только с помощью моделей — это потому, что реализация будет слишком сложной в случае многозадачных таблиц, и вот для чего queryBuilder
спроектированно.
Других решений пока нет …