Kohana, как определить что запрос вернул пустой результат?

KorP

Новичок
Есть запрос вида
PHP:
$photos = DB::select('name')->from('goods_photo')->where('goods_id', '=', $good['id'])->order_by('order')->limit(1)->execute();
Как проверить что результат вернулся пустым? У меня сегодня видимо гуглонесовместимость, кроме разбора результата ничего найти не могу, а уж ман что то скундоват :(
 

Вурдалак

Продвинутый новичок
count($photos)

P.S. Я бы посоветовал использовать Doctrine вместо стандартного ORM (и QB)...
 
  • Like
Реакции: KorP

Gas

может по одной?
Doctrin'а по размеру кода, наверное больше коханы выйдет )
 

Вурдалак

Продвинутый новичок
Стандартный Query Builder в Kohana меня выводит из себя на запросах вида
Код:
        return DB::select(array('COUNT("*")', 'total'))->from('users')
                ->where('ip', '=', DB::expr('INET_ATON(' . Database::quote($ip) . ')'))
                ->execute()->get('total');
В Doctrine же
Код:
      return $this->createQuery()
              ->where('ip = INET_ATON(?)', $ip)
              ->count();
В последний раз, когда его использовал, там было отсутствие возможности нормально выполнить произвольный запрос типа начала транзакции и т.п. — все запросы выполняются через DB::query($type, $query) и в $type только
Код:
Database::SELECT, Database::UPDATE, Database::DELETE, Database::INSERT
Тупо как-то, короче. Я могу ошибаться, но впечатление подпорчено этими мелочами.
 

Adelf

Administrator
Команда форума
Ну вставлю и свои копейки.

Вурдалак
ORM::Factory('user')->where('ip', '=', $value)->count_all()

Doctrin'а по размеру кода, наверное больше коханы выйдет )
В разы :)

PHP:
$photos = DB::select('name')->from('goods_photo')->where('goods_id', '=', $good['id'])->order_by('order')->limit(1)->execute();
А так не лучше? Тут дело даже не в ширине или высоте монитора, а в читабельности.
PHP:
$photos = DB::select('name')
    ->from('goods_photo')
    ->where('goods_id', '=', $good['id'])
    ->order_by('order')
    ->limit(1)
    ->execute();
 

Вурдалак

Продвинутый новичок
Adelf, ip — INT (UNSIGNED), $value — string (127.0.0.1). Можно хранить и в SIGNED + ip2long($value), но корявость QB вылезает всё равно: к примеру,
Код:
...->where('last_visit', '>=', DB::expr("NOW() - INTERVAL {$online} SECOND"))
Не уродство ли? :) Хоть убейте, я вообще не понимаю зачем было делать where() с трёмя аргументами.
 

Adelf

Administrator
Команда форума
Вурдалак
Понятно. Правда в данном конкретном случае, я бы на стороне PHP преобразовывал бы :)
В любом случае в проектах легкой и средне-легкой сложности кохановская ORM вполне решает задачи, на нее возлагаемые.
 

Adelf

Administrator
Команда форума
Хоть убейте, я вообще не понимаю зачем было делать where() с трёмя аргументами.
Наверно, чтобы убрать таким образом заботу о квотировании с юзера. Хотя конечно доктриновский вариант красивее. Надо будет как-нибудь посмотреть можно ли будет безболезненно добавить в кохану такой вариант.
 

Adelf

Administrator
Команда форума
Ах да, забыл.
KorP
Не смотри ты этот ман :) в код смотри. в случае Коханы код гораааздо информативнее. Там ты бы сразу нашел, что Database_result implements ArrayAccess.
 

Adelf

Administrator
Команда форума
Sorc17
если решил отвечать в темы, старайся четко понять задачу и уверенно зная ответ, писать его.
В данном случае этого нет.
 

Здыхлик

Kohaner
Команда форума
Не уродство ли? :) Хоть убейте, я вообще не понимаю зачем было делать where() с трёмя аргументами.
Вероятно, чтобы безболезненно обрабатывать различные конструкции типа IN, IS и т.д. Вообще, я не вижу ничего уродского в таком формате. Непривычно после DOCTRINE? Ну простите...

Кстати, мне больше empty() нравится для проверки ;)
 

Вурдалак

Продвинутый новичок
Здыхлик, посмотри в исходный код builder'а, чтобы не говорить «вероятно»: IN никак не обрабатывает (там идёт работа с $value, а не $op), она только заменяет выражения типа where('col', '=', NULL) на WHERE col IS NULL (спорная помощь) и с BETWEEN чуть другой синтаксис. Взамен получаем проблемы с подстановкой выражений вместо обычных значений (задача «квотирования», как выразился Adelf, наоборот возлагается на пользователя ORM).

На Doctrine я перешёл после работы с Kohana ORM.
 

Здыхлик

Kohaner
Команда форума
Вурдалак, я этот код не один раз просматривал. Помимо всего прочего, QB позволяет в качестве $value использовать массивы (полезно для IN) и объекты (Database_Query для вложенных подзапросов и упомянутый выше Database_Expression).

Не вижу никаких преимуществ Doctrine в том, что в ней можно условие WHERE указывать одной строкой. Условия QB нормально читаются, а лишнюю запятую мне не лень поставить.


В последний раз, когда его использовал, там было отсутствие возможности нормально выполнить произвольный запрос типа начала транзакции и т.п.
На самом деле всегда можно вместо констант Database::SELECT и прочих подставить любое значение - оно используется только один раз, когда нужно определить тип возвращаемого результата (для SELECT нужно вернуть Database_Result, для INSERT - массив из количества записей и первого сгенерированного ID, для всех прочих будет rows_affected).
 

Вурдалак

Продвинутый новичок
Не вижу никаких преимуществ Doctrine в том, что в ней можно условие WHERE указывать одной строкой. Условия QB нормально читаются, а лишнюю запятую мне не лень поставить.
— да ты даже не понял о чём я говорю, читай тред с самого начала, мне лень тебе всё разжёвывать.
 
Сверху