Странное поведение PhalconPHP (ORM)

#php #phalcon

#php #phalcon

Вопрос:

У меня есть два Phalcon Mvc Model (пользователи, города). У каждого пользователя есть город, поэтому модель пользователей имеет отношение hasOne (псевдоним = City).

 $User = Users::findFirst($user_id);
$name = $User->name;
$name = $User->name;
$name = $User->name;
  

Приведенный выше код в порядке, потому что Phalcon выполняет только один запрос к базе данных.

 $User = Users::findFirst($user_id);
$city = $User->City->name;
$city = $User->City->name;
$city = $User->City->name;
  

Приведенный выше код выполняет 3 запроса. Каждый раз, когда я пытаюсь получить значение из Cities, Phalcon снова запускает тот же запрос. Почему?

Phalcon 1.3.2
PHP 5.5.9
PostgreSQL 9.3.4

Ответ №1:

Я предлагаю следующее объяснение:

В первом примере метод findUser() возвращает вам полный пользовательский объект. Он содержит все свойства (столбцы из таблицы базы данных пользователя). Таким образом, вы можете получить доступ к свойствам объекта напрямую. Он также содержит некоторые внешние ключи (табличные отношения), но нет необходимости получать данные из этих таблиц, если вам это не нужно (и это действительно разумно в соответствии с производительностью БД).

Результат — у нас есть 1 запрос к базе данных (findFirst()).

Во втором примере вы пытаетесь получить доступ к связанным табличным данным через пользовательский объект. В этом случае Phalcon каждый раз выполняет дополнительный запрос для получения данных из связанной таблицы с использованием внешнего ключа (поскольку в пользовательском объекте нет информации о городе).

Результат — у нас есть 4 запроса к БД (1 запрос на получение пользовательского объекта и 3 запроса на получение городских объектов).

Комментарии:

1. Очевидно, что $User-> City пуст, но он должен быть инициализирован (заполнен данными) при первой попытке доступа к нему, а затем запись должна храниться в памяти. Другой php-фреймворк, который я использую (Kohana), работает подобным образом, и это очень разумно. Я не знаю, как с этим справляются другие реализации ORM, или существует ли какое-либо стандартное правило, но я думаю, что этот подход Phalcon плох.

2. Если кому-то интересно, мы начали обсуждение этой темы на официальном форуме Phalcon: forum.phalconphp.com/discussion/2729/possible-bug-in-orm