ORM. Поиск всех Informationsystem_Item по Properties

#
ORM. Поиск всех Informationsystem_Item по Properties
Добрый день.  Пытаюсь найти все записи по информационной системе, у которой в дополнительном свойстве есть определенное значение.
Но немного не понимаю, как это можно сделать. Вроде как есть queryBuilder(), но прямой ссылки на properties не нашел.
Подскажите, пожалуйста, как это можно провернуть.
Модератор
#
Re: ORM. Поиск всех Informationsystem_Item по Properties
Пример есть для контроллеров, по сути аналогично: http://www.hostcms.ru/documentation/modules/properties/controllers/
#
Re: ORM. Поиск всех Informationsystem_Item по Properties
HostCMS писал(а):

Сделал вот такой запрос:
   
$oInformationsystem = Core_Entity::factory('Informationsystem', 22);
   $aInformationsystem_Items = $oInformationsystem ->Informationsystem_Items -> queryBuilder() ->
leftJoin('informationsystem_item_properties', 'informationsystem_items.informationsystem_id', '=', 'informationsystem_item_properties.informationsystem_id')
    ->leftJoin('property_value_strings', 'informationsystem_items.id', '=', 'property_value_strings.entity_id',
  array(
          array('AND' => array('informationsystem_item_properties.property_id', '=', Core_QueryBuilder::expression('`property_value_strings`.`property_id`')))
  )
    )
    // Идентификатор дополнительного свойства
    ->where('informationsystem_item_properties.property_id', '=', 12)
    // Значение дополнительного свойства
    ->where('property_value_strings.value', '=', '111')
    ->groupBy('informationsystem_items.id') -> execute();

при выполнении получил вот такую ошибку
Exception: Query error 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LEFT OUTER JOIN `informationsystem_item_properties` ON `informationsystem_items`' at line 3. Query: SELECT * LEFT OUTER JOIN `informationsystem_item_properties` ON `informationsystem_items`.`informationsystem_id` = `informationsystem_item_properties`.`informationsystem_id` LEFT OUTER JOIN `property_value_strings` ON `informationsystem_items`.`id` = `property_value_strings`.`entity_id` AND `informationsystem_item_properties`.`property_id` = `property_value_strings`.`property_id` WHERE `informationsystem_items`.`informationsystem_id` = '22' AND `informationsystem_item_properties`.`property_id` = 12 AND `property_value_strings`.`value` = '111' GROUP BY `informationsystem_items`.`id`
36 modules/core/exception.php
655 modules/core/database/mysql.php
61 modules/core/querybuilder/statement.php
50 hostcmsfiles/lib/lib_49/lib_config_49.php
63 hostcmsfiles/lib/lib_49/lib_config_49.php
421 modules/core/command/controller/default.php
109 modules/core/command/controller/hostcms5/default.php
191 modules/core/router/route.php
239 index.php


У запроса не хватает части from informationsystem_items я это добавил запрос и ручками его выполнил. Данные вернулись.
Потом попробовал добавить в orm запрос метод from('informationsystem_items')
Ничего не падает, но и данные никакие не возвращаются.
Запрос получился вот такой:
$aInformationsystem_Items = $oInformationsystem ->Informationsystem_Items -> queryBuilder() -> from('informationsystem_items') ->
leftJoin('informationsystem_item_properties', 'informationsystem_items.informationsystem_id', '=', 'informationsystem_item_properties.informationsystem_id')
    ->leftJoin('property_value_strings', 'informationsystem_items.id', '=', 'property_value_strings.entity_id',
  array(
          array('AND' => array('informationsystem_item_properties.property_id', '=', Core_QueryBuilder::expression('`property_value_strings`.`property_id`')))
  )
    )
    // Идентификатор дополнительного свойства
    ->where('informationsystem_item_properties.property_id', '=', 12)
    // Значение дополнительного свойства
    ->where('property_value_strings.value', '=', '111')
    ->groupBy('informationsystem_items.id') -> execute();


Может я что-то не так делаю? Подскажите пожалуйста.
#
Re: ORM. Поиск всех Informationsystem_Item по Properties
v_crazy_V писал(а):
->groupBy('informationsystem_items.id') -> execute();

Зачем вы так?
Это же ведь контроллер Informationsystem_Controller_Show  а не QueryBuilder
E-mail: info@syrbek.ru / телега: @syrbek /skype: activexm / syrbek.ru / Поддержка сайтов / г. Москва [HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, Git, SVN, Redmine]
#
Re: ORM. Поиск всех Informationsystem_Item по Properties
v_crazy_V писал(а):
Ничего не падает, но и данные никакие не возвращаются

Если вы хотите передать результаты запроса в некоторый контроллер то попробуйте использовать addEntity на примере как с производителями
E-mail: info@syrbek.ru / телега: @syrbek /skype: activexm / syrbek.ru / Поддержка сайтов / г. Москва [HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, Git, SVN, Redmine]
#
Re: ORM. Поиск всех Informationsystem_Item по Properties
Если честно, я еще не особо разобрался с этим вопросом, поэтому могу запутаться на ровном месте.
Цитата:
Если вы хотите передать результаты запроса в некоторый контроллер то попробуйте использовать

Я не хочу передавать данные в контроллер, мне нужно просто выбрать данные по запросу в $aInformationsystem_Items
чтобы потом пройтись в цикле по нему.
И пока не могу представить как среди этого обилия api сляпать более менее рабочее решение.
Контроллер же потом эти данные выкидывает на вью? Могу тогда я с помощью контроллера достать данные?
#
Re: ORM. Поиск всех Informationsystem_Item по Properties
v_crazy_V писал(а):
Контроллер же потом эти данные выкидывает на вью? Могу тогда я с помощью контроллера достать данные?

Да, то что попадает в контроллер передается в вью. Тогда это вы должны в этот контроллер добавить условие отбора как в примере и применить show тогда увидите что попадает в xml.
E-mail: info@syrbek.ru / телега: @syrbek /skype: activexm / syrbek.ru / Поддержка сайтов / г. Москва [HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, Git, SVN, Redmine]
Модератор
#
Re: ORM. Поиск всех Informationsystem_Item по Properties
Это если просто на ORM:
$oInformationsystem = Core_Entity::factory('Informationsystem', 22);

// Через связь получаем список элементов в ИС
$oInformationsystem_Items = $oInformationsystem->Informationsystem_Items;

// Добавляем доп. ограничения через QB
$oInformationsystem_Items
   ->queryBuilder()
   ->select('informationsystem_items.*')
   ->leftJoin('informationsystem_item_properties', 'informationsystem_items.informationsystem_id', '=', 'informationsystem_item_properties.informationsystem_id')
    ->leftJoin('property_value_strings', 'informationsystem_items.id', '=', 'property_value_strings.entity_id',
     array(
           array('AND' => array('informationsystem_item_properties.property_id', '=', Core_QueryBuilder::expression('`property_value_strings`.`property_id`')))
     )
    )
    // Идентификатор дополнительного свойства
    ->where('informationsystem_item_properties.property_id', '=', 12)
    // Значение дополнительного свойства
    ->where('property_value_strings.value', '=', '111')
    ->groupBy('informationsystem_items.id');
   
$aInformationsystem_Items = $oInformationsystem_Items->findAll();

foreach ($aInformationsystem_Items as $oInformationsystem_Item)
{
   // в $oInformationsystem_Item объект инфоэлемента
}
#
Re: ORM. Поиск всех Informationsystem_Item по Properties
Цитата:
Это если просто на ORM

Попробовал так же сделать, да и Ваш код копировал,  получаю
Exception: Could not execute Informationsystem_Item_Model::__construct()

нашел с этой ошибкой тему https://www.hostcms.ru/forums/2/7121/page-5/
но там тоже решения нет..
Модератор
#
Re: ORM. Поиск всех Informationsystem_Item по Properties
не хватало
->select('informationsystem_items.*')
при объединении необходимо выбирать данные из таблицы той модели, которую выбираем.
Авторизация