Ограничить к выборке товары, которых нет в наличии

#
Re: Ограничить к выборке товары, которых нет в наличии
Да, я от него получаю обьект магазина и всего то дальше делаю выборку Товаров, по нужным мне условиям, далее эти товары я добавляю в xml контроллера показа
#
Re: Re: Re: Ограничить к выборке товары, которых нет в наличии
Дописал shop_items ошибка  изменилась https://joxi.ru/KAxNo7RCqbZy9m

$fieldName = count($Shop_Controller_Show->getFilterProperties()) || count($Shop_Controller_Show->getFilterPrices()) || $Shop_Controller_Show->producer

    ? $Shop_Controller_Show->getFilterTableName() . '.shop_item_id'

    : 'shop_items.id';
   $cur_oShop = $Shop_Controller_Show->getEntity();
  $cur_oShopItems = $cur_oShop->Shop_Items;
   $cur_oShopItems->queryBuilder()
    ->join('shop_warehouse_items', 'shop_warehouse_items.shop_item_id', '=', $fieldName)

   ->join('shop_warehouses', 'shop_warehouses.id', '=', 'shop_warehouse_items.shop_warehouse_id')

   ->where('shop_warehouses.active', '=', 1)

   ->where('shop_warehouses.deleted', '=', 0)

   ->having('SUM(shop_warehouse_items.count)', '>', 0)
     ->where('shop_items.shop_group_id', '=', $cur_group_cat)
      ->where('shop_items.deleted', '!=', 1)
      ->where('shop_items.id', '!=', $cur_item_cat)
      ->where('shop_items.modification_id', '=', 0)
      ->where('shop_items.shortcut_id', '=', 0)
      ->where('shop_items.active', '=', 1)
      ->where('shop_items.price', '>', 0)
     ->clearOrderBy()
    ->orderBy('RAND()')

    ->limit(30);
    $cur_aShopItems = $cur_oShopItems->findAll();
Модератор
#
Re: Ограничить к выборке товары, которых нет в наличии
PakoGonsalezZ,
Вы делаете собственный отдельный запрос, по ошибке можно найти поиском по сайту, даю прямую ссылку.
Объединения с другими таблицами через queryBuilder
Цитата:
При объединении с другими таблицами, в результирующий набор выбираются поля из всех таблиц. Учитывая, что модели могут быть заданы только (1) её свойства, (2) data-атрибуты, (3) public-свойства модели, (4) свойства, перехваченные через хуки, то при попытке установить несуществующее свойство будет сгенерировано исключение Exception: Could not call class constructor ..._Model::__construct().

Учитывая вышеизложенное, при объединении таблиц необходимо явно указывать таблицу через ->clearSelect()->select('таблица.*'), из которой нужно выбирать значения
#
Re: Ограничить к выборке товары, которых нет в наличии
Спасибо за ответ, ошибка ушла, но я по какой то причине получаю 1 товар, по условиям выбираю товары группы, там  их огромное количество.

   
$cur_group_cat = $Shop_Controller_Show->group;
   $cur_item_cat = $Shop_Controller_Show->item;
   $fieldName = count($Shop_Controller_Show->getFilterProperties()) || count($Shop_Controller_Show->getFilterPrices()) || $Shop_Controller_Show->producer
    ? $Shop_Controller_Show->getFilterTableName() . '.shop_item_id'
    : 'shop_items.id';
   $cur_oShop = $Shop_Controller_Show->getEntity();
  $cur_oShopItems = $cur_oShop->Shop_Items;
   $cur_oShopItems->queryBuilder()
    ->join('shop_warehouse_items', 'shop_warehouse_items.shop_item_id', '=', $fieldName)
   ->join('shop_warehouses', 'shop_warehouses.id', '=', 'shop_warehouse_items.shop_warehouse_id')
   ->where('shop_warehouses.active', '=', 1)
   ->where('shop_warehouses.deleted', '=', 0)
   ->having('SUM(shop_warehouse_items.count)', '>', 0)
     ->where('shop_items.shop_group_id', '=', $cur_group_cat)
      ->where('shop_items.deleted', '!=', 1)
     ->where('shop_items.id', '!=', $cur_item_cat)
      ->where('shop_items.modification_id', '=', 0)
      ->where('shop_items.shortcut_id', '=', 0)
      ->where('shop_items.active', '=', 1)
      ->where('shop_items.price', '>', 0)
         ->clearSelect()
   ->select('shop_items.*')
     ->clearOrderBy()
    ->orderBy('RAND()')
    ->limit(30)
;
    $cur_aShopItems = $cur_oShopItems->findAll();
#
Re: Ограничить к выборке товары, которых нет в наличии
hostcms писал(а):

Подскажите пожалуйста в чем может быть причина, что выборка не работает как работала, до добавления  ограничения по складам
Модератор
#
Re: Ограничить к выборке товары, которых нет в наличии
PakoGonsalezZ,
Необходимо открыть SQL-запрос, выполнить его и посмотреть почему там всего 1 товар. Запрос можно увидеть в верхней панели.
#
Re: Ограничить к выборке товары, которых нет в наличии
hostcms писал(а):
Необходимо открыть SQL-запрос, выполнить его и посмотреть почему там всего 1 товар. Запрос можно увидеть в верхней панели.

Открыл я запрос, вижу там выборку, которую вижу и в коде php http://joxi.ru/p27v93eHE89YDm
В группе около 700 товаров, лимит у меня выставлен, без кода который выбирает товары по сумме остатка на складах, выходит 30 товаров, что то не так именно с ограничением по наличию
#
Re: Ограничить к выборке товары, которых нет в наличии
У вас в итоговом запросе у оператора WHERE два условия для поля `deleted`
... AND `shop_items`.`deleted` != 1 ... AND `shop_items`.`deleted` = 0...

Попробуйте перед первым своим вызовом метода where() добавить clearWhere()
#
Re: Ограничить к выборке товары, которых нет в наличии
lezhenkin писал(а):
Попробуйте перед первым своим вызовом метода where() добавить clearWhere()

Добавил, по итогу другой товар вывелся, но все равно один

$fieldName = count($Shop_Controller_Show->getFilterProperties()) || count($Shop_Controller_Show->getFilterPrices()) ||  $Shop_Controller_Show->producer
   ? $Shop_Controller_Show->getFilterTableName() . '.shop_item_id'
   : 'shop_items.id';
   $cur_oShop = $Shop_Controller_Show->getEntity();
  $cur_oShopItems = $cur_oShop->Shop_Items;
   $cur_oShopItems->queryBuilder()
     ->join('shop_warehouse_items', 'shop_warehouse_items.shop_item_id', '=', $fieldName)
   ->join('shop_warehouses', 'shop_warehouses.id', '=', 'shop_warehouse_items.shop_warehouse_id')
    ->clearWhere()
   ->where('shop_warehouses.active', '=', 1)
    ->having('SUM(shop_warehouse_items.count)', '>', 0)
     ->where('shop_items.shop_group_id', '=', $cur_group_cat)
     ->where('shop_items.id', '!=', $cur_item_cat)
      ->where('shop_items.modification_id', '=', 0)
      ->where('shop_items.shortcut_id', '=', 0)
      ->where('shop_items.active', '=', 1)
      ->where('shop_items.price', '>', 0)
          ->clearSelect()
   ->select('shop_items.*')
    ->limit(30)
;


lezhenkin писал(а):
У вас в итоговом запросе у оператора WHERE два условия для поля `deleted`

Как это может повлиять? Убрал, код что ниже, ничего не изменилось
  
   ->where('shop_items.deleted', '!=', 1)

hostcms писал(а):

Пожалуйста, помогите решить проблему
#
Re: Ограничить к выборке товары, которых нет в наличии
Цитата:
Как это может повлиять? Убрал, код что ниже, ничего не изменилось

Ну, как видите, может. Сами же сказали:
Цитата:
Добавил, по итогу другой товар вывелся, но все равно один

Сами себе противоречите
Авторизация