Phalcon | Один запрос из двух для «принадлежит»

Можно ли сделать один 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

Спасибо 🙂

1

Решение

$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 спроектированно.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector