Построитель запросов QueryBuilder

Модератор
#
Re: Построитель запросов QueryBuilder
sunname писал(а):
но все равно, не получается, как сделать ->where('property_value_strings.value', '=', 'для каждого элемента свой') ?

я не понимаю вас.

sunname писал(а):
как выводить только те элементы из подгрупп, которые содержат в доп. свойстве идентификатор текущей страницы.

текущей страницы это из узла структуры? он в константе CURRENT_STRUCTRUE_ID
#
Re: Построитель запросов QueryBuilder
Использую следующий код.

$oShop = Core_Entity::factory( 'Shop', $id );
   
   $oShop_Item_Discounts = $oShop->Shop_Discounts->Shop_Item_Discounts;
   
   $oShop_Item_Discounts->queryBuilder()
      ->straightJoin()
      ->join( 'shop_items', 'shop_item_discounts.shop_item_id', '=', 'shop_items.id' )
      ->join( 'shop_discounts', 'shop_item_discounts.shop_discount_id', '=', 'shop_discounts.id' )
      ->where( 'shop_items.shop_id', '=', $oShop->id )
      ->where( 'shop_discounts.active', '=', 1 )
      ->where( 'shop_discounts.deleted', '=', 0 )
      ->orderBy( 'shop_discounts.end_datetime', 'DESC' );
   
   $aShop_Item_Discounts = $oShop_Item_Discounts->findAll();


В итоге это преобразуется в такой SQL-запрос.

SELECT
*
FROM `shop_item_discounts`
INNER JOIN `shop_items` ON `shop_item_discounts`.`shop_item_id` = `shop_items`.`id`
INNER JOIN `shop_discounts` ON `shop_item_discounts`.`shop_discount_id` = `shop_discounts`.`id`
WHERE  `shop_item_discounts`.`shop_discount_id` IS NULL AND `shop_items`.`shop_id` = 4 AND `shop_discounts`.`active` = 1 AND `shop_discounts`.`deleted` = 0
ORDER BY `shop_discounts`.`end_datetime` DESC


Не могу понять, откуда берется условие
WHERE  `shop_item_discounts`.`shop_discount_id` IS NULL
, и как его убрать.

Подскажите, пожалуйста.
#
Re: Построитель запросов QueryBuilder
В общем, я всё переделал, и сейчас у меня вот что.

$oShop = Core_Entity::factory( 'Shop', $id );
   
   $Shop_Controller_Show = new Shop_Controller_Show( $oShop );
   
   $oShop_Items = Core_Entity::factory( 'Shop_Item' );
   
   $oShop_Items->queryBuilder()
      ->straightJoin()
      ->join( 'shop_item_discounts', 'shop_items.id', '=', 'shop_item_discounts.shop_item_id' )
      ->join( 'shop_discounts', 'shop_item_discounts.shop_discount_id', '=', 'shop_discounts.id' )
      ->where( 'shop_items.shop_id', '=', $oShop->id )
      ->where( 'shop_discounts.active', '=', 1 )
      ->where( 'shop_discounts.deleted', '=', 0 )
      ->orderBy( 'shop_discounts.end_datetime', 'DESC' )
      ->groupBy( 'shop_items.id' );
   
   $aShop_Items = $oShop_Items->findAll();
   
   foreach( $aShop_Items as $Shop_Item ) {
      
      $oShop_Item_Discount = $Shop_Item->Shop_Item_Discounts;
      
      $Shop_Controller_Show->addEntity(
         
         $Shop_Item->addEntity(
            
            $oShop_Item_Discount->clearEntities()
            
         )
         
      );
      
   }


Получилось в итоге то, что я хотел. Но откуда взялось то условие из моего предыдущего примера?
Модератор
#
Re: Построитель запросов QueryBuilder
Причина вот в этом
$oShop_Item_Discounts = $oShop->Shop_Discounts->Shop_Item_Discounts;

$oShop->Shop_Discounts - связь 1-ко-многим, это не настроенный объект ORM с конкретным ID.
Затем вы почему-то делаете
Shop_Discounts->Shop_Item_Discounts
отсюда и NULL, у Shop_Discounts идентификатора нет, это объект с настроенными условиями отборки, который ждет свой findAll()
#
Re: Построитель запросов QueryBuilder
hostcms, я понял. Благодарю.
#
Re: Построитель запросов QueryBuilder
Подскажите, пожалуйста, как можно получить ID последней добавленной записи, если использовался метод save()?
Модератор
#
Re: Построитель запросов QueryBuilder
lezhenkin,
у объекта ->id, либо у объекта ->getPrimaryKey()
#
Re: Построитель запросов QueryBuilder
hostcms, а к чему применять метод getPrimaryKey()?

Допустим, я делаю так
$oEntity = Core_Entity::factory( "Entity" )
   ->name("new entity")
   ->text("new entity text")
   ->save();

При этом в таблицу БД `entities` будет добавлена новая запись со значениями полей `name` и `text`, которые были переданы мною в виде аргументов методов.

А вот как сразу же после применения метода save() получить id этой сохраненной записи?

Если прям тут же сделать
$oEntity->getPrimaryKey()

вернется идентификатор только что добавленной записи?
Модератор
#
Re: Построитель запросов QueryBuilder
lezhenkin писал(а):
а к чему применять метод getPrimaryKey()?

к объекту, которому вызываете save()

var_dump($oEntity->getPrimaryKey());
// или
var_dump($oEntity->id);
#
Re: Построитель запросов QueryBuilder
hostcms, благодарю.
Авторизация