<rmcreative>

RSS

Yii, построитель запроса

17 ноября 2010

Сегодня в SVN Yii появилась ещё одна интересная возможность. Построитель запросов. Тем, кто работал с CodeIgniter, он должен быть хорошо знаком (там он почему-то называется ActiveRecord).

Итак, теперь, если вы не хотите использовать ActiveRecord, запросы можно строить динамически:

$user = Yii::app()->db->createCommand()
  ->select('username, password')
  ->from('tbl_user')
  ->where('id=:id', array(':id'=>1))
  ->queryRow();

Комментарии RSS

  1. №3400
    Alex Shinkevich
    Alex Shinkevich 17 нояб. 2010 г., 16:49:56

    Супер. Действительно после долгой работы с CI остаются пристрастия

  2. №3401
    Rustam Zagirov
    Rustam Zagirov 17 нояб. 2010 г., 17:03:49

    Действительно, это было удобно в CI, хотя в yii можно это можно реализовать через Criteria

  3. №3402
    none
    none 17 нояб. 2010 г., 17:04:22

    А чего бы Доктрину не прикрутить?

  4. №3403
    Ekstazi
    Ekstazi 17 нояб. 2010 г., 18:50:36

    Хорошая идея! Теперь запросы будут записаны в более понятной форме!

  5. №3404
    Sam
    Sam 17 нояб. 2010 г., 19:08:46

    none, зачем? AR в Yii удобней и быстрее. Как выйдет вторая, можно будет поиздеваться, а пока уж точно нет смысла.

  6. №3405
    AmdY
    AmdY 17 нояб. 2010 г., 21:14:38

    Ну всё и здесь будут толкать модель в контроллер. Query builder это лишь дополнение к AR, которое даёт возможность обходить сложности и костыли появляющиеся после перехода от sql к объектам.

  7. №3406
    Andrew
    Andrew 17 нояб. 2010 г., 21:39:07

    Метод createCommand() смело можно убирать из цепочки, он только сложности добавляет. Подстановка же параметров, например, в условиях where в Zend сделана удобнее. В итоге yii пока отстает.

  8. №3407
    Andrey
    Andrey 18 нояб. 2010 г., 0:37:01

    удобно, конечно :)

  9. №3408
    Alexander
    Alexander 18 нояб. 2010 г., 13:52:38

    ->where('id=:id', array(':id'=>1))

    это ужасно.

  10. №3409
    Sam
    Sam 18 нояб. 2010 г., 16:57:07

    Чем ужасно?

  11. №3412
    Alexander
    Alexander 18 нояб. 2010 г., 19:46:58

    Ужасно дико это печатать, пожалейте кодеров. Конечно php "костноязычен" достаточно, так зачем же ещё усугублять.

  12. №3418
    DropSQL
    DropSQL 19 нояб. 2010 г., 21:13:25

    Спасибо за хорошую новость, Criteria меня не очень устраивает по структуре, а здесь всё удобно и хорошо! :)

  13. №3514
    Nayjest
    Nayjest 05 дек. 2010 г., 13:18:13

    Alexander, а как по вашему было бы удобней? (На PHP)

  14. №3515
    Sam
    Sam 05 дек. 2010 г., 20:39:15

    Как удобней запросы делать? Мне нравится Active Record + criteria.

  15. №4127
    Meee
    Meee 16 марта 2011 г., 7:53:01

    Ребят извини за тупость а как быть с OR или AND?

  16. №4128
    Meee
    Meee 16 марта 2011 г., 10:58:49

    Доудмался))) where('id=:id1 or id=:id2', array(':id1'=>1, ':id2'=>2))

  17. №4201
    vladdis
    vladdis 25 марта 2011 г., 7:33:10

    построитель работает только разом? в CI его можно было разбросать кусками по листингу и только в конце выполнить. например, $user->select(...) далее условие if (что-то) $user->where(1=1) else $user->where(2=2). в yii так не работает, увы

  18. №4204
    Sam
    Sam 25 марта 2011 г., 12:05:04

    Не, не только разом. Работает всё:

    $command = Yii::app()->db->createCommand()
      ->select('username, password')
      ->from('tbl_user');
     
     //
     
      $command->where('id=:id', array(':id'=>1));
     
     //
      $user = $command->queryRow();
  19. №4205
    vladdis
    vladdis 25 марта 2011 г., 13:02:48

    интересно. если запрос разом $command = Yii::app()->db->...->queryAll() то работает сразу foreach $command as $c... а если запрос собран частями то работает только через присваивание $c=$command->queryAll() и уже далее foreach... это так задумано?

  20. №4206
    Sam
    Sam 25 марта 2011 г., 13:47:41

    Да. foreach мы делаем для того, что возвращает queryAll, а не для самой команды.

  21. №4386
    Андрей
    Андрей 14 апр. 2011 г., 0:10:36

    Ну и костыль же сделали... я конечно не скажу за OR или Criteria ( я их не видел ). Но вот АР в ЦИ на много легче читать и писать чем тут... ппц просто where('id=:id1 or id=:id2', array(':id1'=>1, ':id2'=>2)) что бы я столько кода писал ! и еще так тупо как-то... В ЦИ все просто or_WHERE(array) или WHERE(array), нравится писать разные там query ? используй метод query().

    Я +1 - это изврат!

  22. №4390
    vladdis
    vladdis 14 апр. 2011 г., 14:21:30

    согласен, в ЦИ запрос собирать интереснее. можно даже не соблюдать последовательность операторов - он сам построит как надо

  23. №5307
    sers
    sers 05 сент. 2011 г., 14:17:09
    public function getCompanyCount($inLastDays = 0)
    {
        $select = Yii::app()->db->createCommand()
          ->select('COUNT(*) as count')
          ->where("is_active = 1")
          ->where("is_person = 0")
          ->from(self::tableName())
          ->queryRow();
     
     
        return $count['count'];
    }

    такая последовательность where не работает?

  24. №5308
    Sam
    Sam 05 сент. 2011 г., 17:55:29

    sers, работает, но is_active перетрётся is_person.

  25. №5649
    Дмитрий
    Дмитрий 08 дек. 2011 г., 15:38:08

    У меня не работает такая конструкция ->where('id=:id1', array(':id1'=>1))

    ->text тупо выдает SELECT * FROM table_name WHERE id=:id1

    и вообще заметил что ну не заменяются :id

  26. №5650
    Sam
    Sam 08 дек. 2011 г., 22:03:17

    Они и не должны. Они передаются как параметры prepared statement.

  27. №5667
    Дмитрий
    Дмитрий 14 дек. 2011 г., 23:24:50
    $command = Yii::app()->db->createCommand()
      ->select('username, password')
      ->from('tbl_user')
    ->where('id=:id', array(':id'=>1));
     
      $user = $command->queryRow();

    по идее целостный (рабочий) код? и в результате $user будет содержать выборку... или я что-то опять не так понял? и $user будет у нас как "ссылка" на запрос, а сам запрос будет выполнен потом? сори пока нет времени лезть глубоко в код - время сегодня ночью занято, на ТЗ проекта. освобожусь обязательно гляну но хотя бы логику процесса хотелось бы услышать. спасибо

  1. Почта опубликована не будет.

  2. Можно использовать синтаксис Markdown или HTML.

  3. Введите ответ в поле. Щёлкните, чтобы получить другую задачу.