<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.11.2010, 16:49:56

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

  2. №3401
    Rustam Zagirov
    Rustam Zagirov 17.11.2010, 17:03:49

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

  3. №3402
    none
    none 17.11.2010, 17:04:22

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

  4. №3403
    Ekstazi
    Ekstazi 17.11.2010, 18:50:36

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

  5. №3404
    Sam
    Sam 17.11.2010, 19:08:46

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

  6. №3405
    AmdY
    AmdY 17.11.2010, 21:14:38

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

  7. №3406
    Andrew
    Andrew 17.11.2010, 21:39:07

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

  8. №3407
    Andrey
    Andrey 18.11.2010, 0:37:01

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

  9. №3408
    Alexander
    Alexander 18.11.2010, 13:52:38

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

    это ужасно.

  10. №3409
    Sam
    Sam 18.11.2010, 16:57:07

    Чем ужасно?

  11. №3412
    Alexander
    Alexander 18.11.2010, 19:46:58

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

  12. №3418
    DropSQL
    DropSQL 19.11.2010, 21:13:25

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

  13. №3514
    Nayjest
    Nayjest 05.12.2010, 13:18:13

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

  14. №3515
    Sam
    Sam 05.12.2010, 20:39:15

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

  15. №4127
    Meee
    Meee 16.03.2011, 7:53:01

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

  16. №4128
    Meee
    Meee 16.03.2011, 10:58:49

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

  17. №4201
    vladdis
    vladdis 25.03.2011, 7:33:10

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

  18. №4204
    Sam
    Sam 25.03.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.03.2011, 13:02:48

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

  20. №4206
    Sam
    Sam 25.03.2011, 13:47:41

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

  21. №4386
    Андрей
    Андрей 14.04.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.04.2011, 14:21:30

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

  23. №5307
    sers
    sers 05.09.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.09.2011, 17:55:29

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

  25. №5649
    Дмитрий
    Дмитрий 08.12.2011, 15:38:08

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

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

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

  26. №5650
    Sam
    Sam 08.12.2011, 22:03:17

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

  27. №5667
    Дмитрий
    Дмитрий 14.12.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. Введите ответ в поле. Щёлкните, чтобы получить другую задачу.