Всем привет.
Англоязычный блог ProDevTips, посвящённый веб-разработке, опубликовал заметку про расширение возможностей Zend_Db_Table. Расскажу вкратце, что же они предлагают, немного дополнив их идеи своими поправками.

Очистка вставляемых данных

При insert’е стандартными средствами Zend_Db_Table_Abstract (который использует Zend_Db) существование в таблице столбцов проверяется только средствами СУБД. Приведённый ниже способ расширит Zend_Db_Table так, чтобы массив вставляемых данных очищался от лишних данных.

1
2
3
4
5
6
7
function cleanArray($arr){
    return array_intersect_key($arr, array_combine($this->_cols, $this->_cols));
}

function insert(array $insert_arr){
    return parent::insert($this->cleanArray($insert_arr));
}

Думаю, пояснять в этом коде совершенно нечего – всё элементарно. Однако код, на мой взгляд, получился довольно изящным.
В оригинале предлагается использовать этот способ для вставки данных напрямую из массива $_POST. Главное – не забывать фильтровать вставляемые данные. От SQL-инъекций Zend_Db защищает, а вот тот же trim() (или Zend_Filter_StringTrim) придётся делать самим.

Обновление записи по primary key

Ничего особенного, просто немного удобства:

1
2
3
function updateOne($update_arr, $id_value){
    return parent::update($this->cleanArray($update_arr), "{$this->_primary[1]} = $id_value");
}

Проверка существования записей

1
2
3
function exists($where){
    return $this->fetchAll($where)->count() > 0 ? true : false;
}

Удаление записи по primary key

1
2
3
function deleteOne($id_value){
    return $this->delete("{$this->_primary[1]} = $id_value");
}

Удаление первой из найденных строк

1
2
3
4
5
6
function deleteFirst($where, $key = false){
    $key = $key == false ? $this->_primary[1] : $key;
    $id = $this->fetchAll($where)->current()->$key;
    parent::delete("$key = '$id'");
    return $id;
}

Обновление нескольких записей

1
2
3
4
5
6
7
function updateAll($update_arr, $field_value, $field_id){
    if(is_array($update_arr)){
        foreach($update_arr as $key => $val){
            $result = $this->update(array($field_value => $val), "$field_id = '$key'");
        }
    }
}

Пример использования: updateAll(array(1 => ‘ok’, 3 => ‘not_ok’), ’status’, ‘id’)

Выборка одной ячейки

Здесь с оригиналом расхождение. Очевидно, они просто не знают про метод find(), поэтому создали следующий метод:

1
2
3
4
function fetchOne($id, $as_arr = false){
    $result = $this->fetchRow("{$this->_primary[1]} = $id");
    return $as_arr ? $result->toArray() : $result;
}

Никакой практической ценности здесь я не вижу, ибо у нас есть find(). Вместо этого я предлагаю свой вариант fetchOne(), с функционалом, аналогичным Zend_Db_Adapter_Abstract::fetchOne():

1
2
3
4
function fetchOne($where, $field){
    $result = $this->fetchRow($where);
    return $result ? $result->$field : false;
}

В статье есть ещё несколько советов, но я не посчитал их стоящими публикации здесь – слишком сомнительна их практическая польза. Вы можете ознакомиться с ними здесь.
Спасибо за внимание, всего доброго.

9 Comments

  1. Igor says:

    Хорошая статья, будем использовать.

  2. vitaliy says:

    return $this->fetchAll($where)->count() > 0 ? true : false;
    результат тот же:
    return $this->fetchAll($where)->count() > 0;

  3. admin says:

    Я бы даже сказал:
    (bool)$this->fetchAll($where)->count() > 0;

    Но автор этого кода не я, а ProDevTips, поэтому вносить изменения не стал.

  4. Igor says:

    Кстати, а каким макаром экранируются данные при такой втсавке?
    $this->_usetTable->insert( $form->getValues() )

  5. admin says:

    Экранируются внутри DB-адаптера.

  6. Nayre says:

    Прошу прощения если залез не в “тот” топик, изучаю ZF 3 день, и столкнулся с такой проблемой. Как средствами Zend_Db_Table или Zend_Db_Table_Abstract при использовании функции insert получить id(идентификатор) вставленной записи?

  7. RooTooZ says:

    $accounts->insert( $data );
    $last_insert_id = $accounts->getLastInsertId();

  8. Ale says:

    есть ли возможность выборки дерева или ветки по заданному идентификатору?

  9. Eugene says:

    $last_insert_id = $accounts->insert( $data );

    ??

Leave a Reply