ActiveRecord for MySQL temporary tables

Выкладываем свои наработки
Ответить
Аватара пользователя
SeynovAM
Сообщения: 4
Зарегистрирован: 2013.11.07, 19:27

ActiveRecord for MySQL temporary tables

Сообщение SeynovAM »

Возникла необходимость заюзать temporary table, но поиск по интернетам ничего не дал.
Решил вот поделиться свой нароботочкой:
MysqlTemporaryActiveRecord.zip
MysqlTemporaryActiveRecord class
(1.35 КБ) 232 скачивания
Как использовать: создаете класс своей модели и наследуете от MysqlTemporaryActiveRecord класса.
Переопределяете абстрактный метод getTableColumns(), который должен возвращать структуру таблицы (формат такой же, как и в CDbSchema::createTable()):

Код: Выделить всё

Yii::import('path.to.MysqlTemporaryActiveRecord');

class Contact extends MysqlTemporaryActiveRecord {
    // ...
    public function getTableColumns()
    {
        return array(
            'id' => 'pk',
            'name' => 'string NOT NULL',
            'email' => 'string',
        );
    }
    // ...
}
Вся остальная работа такая же, как и с обычным ActiveRecord.
Есть и еще плюшки:
1. Можно переопределить метод getTableOptions() для переопределения параметров таблицы (charset, engine).
2. Можно переопределить метод afterCreatingTable() для добавления своей логики после создания таблицы, например, создания ключей и индексов.
Например:

Код: Выделить всё

    // ...
    public function getTableOptions()
    {
        return 'ENGINE InnoDB DEFAULT CHARACTER SET utf8';
    }
    // ...
    protected function afterCreatingTable()
    {
        $this->dbConnection->createCommand()->createIndex('idx_contact_name', $this->tableName(), 'name', true);
    }
    // ...
П.с. думал еще в качестве extionsion'а на http://yiiframework.com выложить, но там говорят, что я слишком молодой для этого :)
Аватара пользователя
alexzv
Сообщения: 120
Зарегистрирован: 2010.04.23, 00:10
Откуда: Украина, Киев

Re: ActiveRecord for MySQL temporary tables

Сообщение alexzv »

Довольно странно создавать объект для временной таблицы...
Аватара пользователя
SeynovAM
Сообщения: 4
Зарегистрирован: 2013.11.07, 19:27

Re: ActiveRecord for MySQL temporary tables

Сообщение SeynovAM »

alexzv писал(а):Довольно странно создавать объект для временной таблицы...
Для временной таблицы создается класс. Объекты (если не вдаваться во внутреннюю реализацию CActiveRecord) создаются для строк таблицы.
В общем, как я и говорил, дальнейшая работа со строками временной таблицы, точь-в-точь как и для обычной таблицы.
К примеру:

Код: Выделить всё

// ...
$contact = new Contact();
$contact->name = 'some name';
$contact->email = 'some@email.com';
$contact->save();
// ...
$contact = Contact::model()->findByPk(15);
$contact->delete();
//...
Аватара пользователя
alexzv
Сообщения: 120
Зарегистрирован: 2010.04.23, 00:10
Откуда: Украина, Киев

Re: ActiveRecord for MySQL temporary tables

Сообщение alexzv »

Я дополню: странно описывать класс и создавать объекты для выборки из временной таблицы.
Объясню:
1) Вы можете гарантировать, что таблица будет доступна на все время жизни приложения?
2) Даже если Вы осознаете все нюансы работы с временными таблицами, по моему это дополнительно усложняет понимание кода и скорее является антипатерном для разработки веб-приложений.

А так, может и правда кому-нибудь пригодится... хотя для себя я не могу придумать ситуации, когда это можно было бы использовать...
Аватара пользователя
SeynovAM
Сообщения: 4
Зарегистрирован: 2013.11.07, 19:27

Re: ActiveRecord for MySQL temporary tables

Сообщение SeynovAM »

alexzv писал(а):Я дополню: странно описывать класс и создавать объекты для выборки из временной таблицы.
Объясню:
1) Вы можете гарантировать, что таблица будет доступна на все время жизни приложения?
2) Даже если Вы осознаете все нюансы работы с временными таблицами, по моему это дополнительно усложняет понимание кода и скорее является антипатерном для разработки веб-приложений.
1 - да, в этом и вся фишка. Таблица создастся при первом обращении к модели, и дальше уже будет существовать на все время жизни приложения. Естественно, все сломается, если кто-то закроет connection, но это редко кому вообще нужно. Также все сломается, если произойдет обрыв связи с базой, но тут возникают проблемы, никак не связанные с использование временных таблиц.
2 - мне было удобно использовать в этом случае всю мощь ActiveRecord'ов (обращение к полям записи как к свойствам объекта, использовать relation'ы, валидаторы и прочее).

В любом случае спасибо за мнение.
Ответить