<rmcreative>

RSS

Все заметки с тегом «Active Record»

Можно уточнить:

    (1)
    (1)
    (1)
    (1)
    (1)
  1. (2)
  2. (1)
    (7)
  1. (1)
  1. Yii2: JOIN вернулся

    8 января 2014

    В Active Record Yii2 вернулся JOIN. Внутри всё значительно проще, чем было в Yii 1.1, но возможностей сильно больше.

    Сразу скажу, что поддержка noSQL никуда не делась. Более того, можно в одном «запросе» выбрать JOIN-ом из нескольких SQL-таблиц, а часть связанных данных забрать, например, из MongoDB.

    Отличный пример привёл ORey на англоязычном форуме:

    // Выбираем MyModel с relation1 и relation2.
    // Все три забираем запросом с JOIN.
    $query = MyModel::find()
        ->joinWith(['relation1', 'relation2']);
     
    $countQuery = clone $query;
    $pages = new Pagination(['totalCount' => $countQuery->count(), 'pageSize' => 15]);
     
    $items = $query
        ->orderBy($sort->orders)
        ->offset($pages->offset)
        ->limit($pages->limit)
        // Забираем дополнительно relation3 и relation4.
        // Фильтровать по ним нам не нужно, так что будут
        // запросы вида WHERE ID IN (1,2,3,4) или аналоги
        // для noSQL.
        ->with(['relation3', 'relation4'])
        ->all();

    Официальная документация на тему

    24 комментария
  2. Yii: всегда учитывайте неудачный save модели

    2 мая 2011

    Те, кто раньше не работал с Yii, на первых порах часто совершают очень нехорошую ошибку:

    $model = new Post();
    if(!empty($_POST['Post']))
    {
      $model->attributes = $_POST['Post'];
      $model->save();
      $this->redirect(array());
    }
    $this->render('form', array(
      'model' => $model,
    ));

    Вот такой, казалось бы, простой код убить может немало нервов. Дело в том, что save запросто может не сработать, если не выполнится правило валидации. А т.к. мы этого не проверили, произойдёт редирект без каких-либо признаков ошибки.

    15 комментариев
  3. Yii: универсальный scope для отношений

    19 апреля 2011

    Довольно часто простые именованные группы условий, они же scope, требуется использовать как в отношении, так для самой модели, в которой они описаны. Делается такой scope следующим образом:

    public function published($val = true)
    {
        $val = (int)$val;
        $owner=$this->getOwner();
        $criteria=$owner->getDbCriteria();
        $alias=$owner->getTableAlias();
     
        $criteria->mergeWith(array(
            'condition'=>$alias.'.published='.$val,
        ));
     
        return $owner;
    }

    getTableAlias даёт нам t, если используется сама модели и имя таблицы, если scope используется в отношении.

    17 комментариев
  4. Почему в Yii свой ActiveRecord

    10 марта 2011

    Казалось бы, зачем изобретать велосипед и писать свой Active Record, а не взять существующую реализацию… например, phpactiverecord, RedBeanPHP или тот же ORM Doctrine. В случае Yii всё не так однозначно:

    • AR в Yii старше большинства готовых решений. Первые версии были реализованы в 2005-м ещё в Prado. AR постоянно улучшался и затем перекочевал в Yii, где улучшения продолжаются и сейчас.
    • Свой AR даёт более «ровный» API.
    • Использование внешнего кода = потеря контроля качества реализации. В стороннем коде могут быть ошибки, которые по каким-либо причинам не смогут быстро исправить… а ведь AR — очень важная часть фреймворка.
    41 комментарий
  5. Yii: параметры именованных групп условий в отношениях

    20 февраля 2011

    До готовящегося релиза 1.1.7 можно было применить именованные группы условий, они же named scopes, к отношениям:

    $posts=Post::model()->with('comments:recently:approved')->findAll();

    Но нельзя было указать для них параметры. Решил эту проблему creocoder. Теперь, слив свежий код из SVN, можно делать так:

    $users=User::model()->findAll(
        'with'=>array(
            'posts'=>array(
                'scopes'=>array(
                    'rated'=>5,
                ),
            ),
        ),
    );
    8 комментариев
  6. Кеширование SQL-запросов в Yii

    11 февраля 2011

    Сегодня Qiang реализовал ещё одну интересную штуку для Yii: кеширование запросов к базе данных на всех уровнях от DAO до ActiveRecord.

    $sql = 'SELECT * FROM tbl_post LIMIT 20';
    // кешируем результат запроса 1000 секунд
    $rows = Yii::app()->db->cache(1000)->createCommand($sql)->queryAll();

    Если данные в таблице меняются, можно попробовать инвалидировать кеш, используя менее затратный запрос:

    $sql = 'SELECT * FROM tbl_post LIMIT 20';
    // сбрасываем кеш, если результат изменился
    $dependency = new CDbCacheDependency('SELECT MAX(update_time) FROM tbl_post');
    // кешируем на 1000 секунд
    $rows = Yii::app()->db->cache(1000, $dependency)->createCommand($sql)->queryAll();

    С AR это работает так:

    $posts = Post::model()->cache(1000)->findAll();
    $posts = Post::model()->cache(1000)->with('author')->findAll();

    Опробовать можно, забрав код из SVN. Войдёт в релиз 1.1.7.

    16 комментариев
  7. Наследование с одной таблицей в Yii

    18 августа 2010

    Реляционные БД не поддерживают наследование, поэтому при отображении объекта на БД приходится как-то это обходить. При этом необходимо минимизировать количество JOIN. Решается данная проблема довольно простым способом при помощи паттерна наследование с одной таблицей. При этом, в таблице хранятся столбцы для всей ветки классов, наследуемых от заданного. Для определения типа модели обычно используется поле type.

    В Yii этот паттерн реализуется достаточно красиво.

    Читаем

    13 комментариев