Показ схожих информационных элементов на основе дополнительного свойства

#
Re: Показ схожих информационных элементов на основе дополнительного свойства
hostcms, Вы считаете, что такая конструкция правильнее?
/* 2 - Похожие по свойствам виды древесины - показ схожих инфоэлементов на основе доп. свойств */
$Informationsystem_Controller_Show = new Informationsystem_Controller_Show(Core_Entity::factory('Informationsystem', 55));
$Informationsystem_Controller_Show
   ->xsl(Core_Entity::factory('Xsl')->getByName('ПохожиеПоСвойствамВидыДревесины'))
   ->itemsProperties(true)
   ->limit(99);

$coef = 0.1;

$iItem = intval(Core_Page::instance()->object->item);
if ($iItem)
{
   $oProperty = Core_Entity::factory('Property', 264);
   $aPropertyValues264 = $oProperty->getValues($iItem);
   $oProperty = Core_Entity::factory('Property', 273);
   $aPropertyValues273 = $oProperty->getValues($iItem);
   if (isset($aPropertyValues264[0]) && trim($aPropertyValues264[0]->value) != ''
    && isset($aPropertyValues273[0]) && trim($aPropertyValues273[0]->value) != '')
      {
      $delta264 = intval($aPropertyValues264[0]->value) * $coef;
      $minProperty264 = $aPropertyValues264[0]->value - $delta264;
      $maxProperty264 = $aPropertyValues264[0]->value + $delta264;
      $delta273 = intval($aPropertyValues273[0]->value) * $coef;
      $minProperty273 = $aPropertyValues273[0]->value - $delta273;
      $maxProperty273 = $aPropertyValues273[0]->value + $delta273;

$Informationsystem_Controller_Show
   ->informationsystemItems()
   ->queryBuilder()
   ->leftJoin('informationsystem_item_properties', 'informationsystem_items.informationsystem_id', '=', 'informationsystem_item_properties.informationsystem_id')
   ->leftJoin('property_value_ints', 'informationsystem_items.id', '=', 'property_value_ints.entity_id',
                  array(array('AND' => array('informationsystem_item_properties.property_id', '=', Core_QueryBuilder::expression('`property_value_ints`.`property_id`')))))
   ->leftJoin('property_value_floats', 'informationsystem_items.id', '=', 'property_value_floats.entity_id',
                  array(array('AND' => array('informationsystem_item_properties.property_id', '=', Core_QueryBuilder::expression('`property_value_floats`.`property_id`')))))
   ->open()
   ->where('informationsystem_item_properties.property_id', '=', 264)
   ->where('property_value_ints.value', '>=', $minProperty264)
   ->setAnd()
   ->where('informationsystem_item_properties.property_id', '=', 264)
   ->where('property_value_ints.value', '<=', $maxProperty264)
   ->setOr()
   ->where('informationsystem_item_properties.property_id', '=', 273)
   ->where('property_value_floats.value', '>=', $minProperty273)
   ->setAnd()
   ->where('informationsystem_item_properties.property_id', '=', 273)
   ->where('property_value_floats.value', '<=', $maxProperty273)
   ->setAnd()
   ->where('informationsystem_items.id', '!=', $iItem)
   ->close()
   ->groupBy('informationsystem_items.id')
   ->having(Core_Querybuilder::expression('COUNT(DISTINCT `informationsystem_item_properties`.`property_id`)'), '=', 2);
$Informationsystem_Controller_Show->show();
}}
Модератор
#
Re: Показ схожих информационных элементов на основе дополнительного свойства
Dmitry K.,
1) вы добавили where внутри скобок и ограничение по informationsystem_items.id работает только с последним свойством ->where('property_value_floats.value', '<=', $maxProperty273)
2) ->setAnd() можно не писать, после каждого ->where() оператор сбрасывается на AND
3) есть замечательное сравнение BETWEEN, делает код намного читабельнее

<?php
/* 2 - Похожие по свойствам виды древесины - показ схожих инфоэлементов на основе доп. свойств */
$Informationsystem_Controller_Show = new Informationsystem_Controller_Show(Core_Entity::factory('Informationsystem', 55));
$Informationsystem_Controller_Show
   ->xsl(Core_Entity::factory('Xsl')->getByName('ПохожиеПоСвойствамВидыДревесины'))
   ->itemsProperties(true)
   ->limit(99);

$iItem = intval(Core_Page::instance()->object->item);

if ($iItem)
{
   $oProperty = Core_Entity::factory('Property', 264);
   $aPropertyValues264 = $oProperty->getValues($iItem);
   $oProperty = Core_Entity::factory('Property', 273);
   $aPropertyValues273 = $oProperty->getValues($iItem);

   if (isset($aPropertyValues264[0]) && trim($aPropertyValues264[0]->value) != ''
   && isset($aPropertyValues273[0]) && trim($aPropertyValues273[0]->value) != '')
   {
      $coef = 0.1;

      $delta264 = intval($aPropertyValues264[0]->value) * $coef;
      $minProperty264 = $aPropertyValues264[0]->value - $delta264;
      $maxProperty264 = $aPropertyValues264[0]->value + $delta264;

      $delta273 = intval($aPropertyValues273[0]->value) * $coef;
      $minProperty273 = $aPropertyValues273[0]->value - $delta273;
      $maxProperty273 = $aPropertyValues273[0]->value + $delta273;

      $Informationsystem_Controller_Show
         ->informationsystemItems()
         ->queryBuilder()
         ->leftJoin('informationsystem_item_properties', 'informationsystem_items.informationsystem_id', '=', 'informationsystem_item_properties.informationsystem_id')
         ->leftJoin('property_value_ints', 'informationsystem_items.id', '=', 'property_value_ints.entity_id',
            array(array('AND' => array('informationsystem_item_properties.property_id', '=', Core_QueryBuilder::expression('`property_value_ints`.`property_id`')))))
         ->leftJoin('property_value_floats', 'informationsystem_items.id', '=', 'property_value_floats.entity_id',
            array(array('AND' => array('informationsystem_item_properties.property_id', '=', Core_QueryBuilder::expression('`property_value_floats`.`property_id`')))))
         ->open()
            ->where('informationsystem_item_properties.property_id', '=', 264)
            ->where('property_value_ints.value', 'BETWEEN', array($minProperty264, $maxProperty264))
            ->setOr()
            ->where('informationsystem_item_properties.property_id', '=', 273)
            ->where('property_value_floats.value', 'BETWEEN', array($minProperty273, $maxProperty273))
         ->close()
         ->where('informationsystem_items.id', '!=', $iItem)
         ->groupBy('informationsystem_items.id')
         ->having(Core_Querybuilder::expression('COUNT(DISTINCT `informationsystem_item_properties`.`property_id`)'), '=', 2);

      $Informationsystem_Controller_Show->show();
   }
}
#
Re: Показ схожих информационных элементов на основе дополнительного свойства
Большое спасибо!
Учёл.
Авторизация