Тема: Функция getListCount с условием

Добрый вечер, возникла необходимость подсчета количества записей для пагинатора. На сколько я понимаю, в вашем движке есть функция getListCount для этого. Собственно возник вопрос по ее использованию.
Как добавить для нее условие со связью с другой таблицей. Например есть таблица Product с ее полями id, num, и т.д. и моя таблица Second с полями id, id_product, name (Поле связи соответственно id_product). И необходимо узнать количество записей в таблице Second для которых значение Product.num>1.
Связь получается один ко многим, т.е. одному товару может соответствовать несколько записей в таблице Second, а записи из таблицы Second, соответствует только одна запись из таблицы Product.

Вот например, в контроллере myorders присутствует эта функция: $this->api->getListCount(). Я понимаю, что она считает количество заказов данного пользователя. А как ей воспользоваться со связью с другой таблицей не могу понять. Пробовал написать обыкновенный ORM запрос, но опять же не понял как пользоваться JOIN'ом для такого запроса. 

Заранее огромнейшее спасибо.

Повысить оценку Понизить оценку

2

Re: Функция getListCount с условием

Если необходимо выполнить следующий запрос:

SELECT COUNT(*)
FROM products as A
INNER JOIN second as B ON A.id = B.product_id
WHERE A.num > 0;

Можно сделать это так:

1 способ. С помощью запроса через \RS\Orm\Request

  $result = \RS\Orm\Request::make()
    ->from(new Orm\Product, 'A')
    ->join(new Orm\Second, 'A.id = B.product_id', 'B')
    ->where('A.num > 0')
    ->count();

т.е. можно создать метод в вашей модели, например getSomethingCount() и реализовать в нем такой запрос.


2 способ. С помощью стандартных \Catalog\Model\Api и метода getListCount();

$product_api = new \Catalog\Model\Api();
$product_api->queryObj()
    ->join(new Orm\Second, 'A.id = B.product_id', 'B')
    ->where('A.num > 0');
  
$result = $product_api->getListCount();

т.е. метод queryObj() возвращает текущий объект \RS\Orm\Request, который загружен в API, соответственно там по умолчанию уже присутствует часть запроса

\RS\Orm\Request::make()
    ->from(new Orm\Product, 'A')

и вам остается только добавить недостающую часть.

Повысить оценку +1 Понизить оценку

3 Отредактировано Александр (07.04.2015 12:46:38)

Re: Функция getListCount с условием

А посмотреть какой итоговый запрос у Вас получается можно так:

var_dump(\RS\Orm\Request::make()
    ->from(new Orm\Product, 'A')
    ->join(new Orm\Second, 'A.id = B.product_id', 'B')
    ->where('A.num > 0')
    ->toSql());

или ещё проще:

echo \RS\Orm\Request::make()
    ->from(new Orm\Product, 'A')
    ->join(new Orm\Second, 'A.id = B.product_id', 'B')
    ->where('A.num > 0');

А вообще лучше всего пользоваться современными редакторами для подсветки подсказок. Я например использую phpED 9. И тогда можно будет получить подсказки с описанием методов легко.

Re: Функция getListCount с условием

Спасибо огромное, все реализовал. Пагинатор отлично работает smile

Повысить оценку Понизить оценку