MySQL ARCHIVE Storage Engine

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Gl00mY_ZeiZ
Сообщения: 13
Зарегистрирован: 2012.09.28, 22:43

MySQL ARCHIVE Storage Engine

Сообщение Gl00mY_ZeiZ »

Добрый день!
Есть необходимость писать логи действий пользователей в БД.
Логи подниматься будут чуть чаще чем никогда, и для этого как раз подходит MySQL ARCHIVE Storage Engine.

Написал метод в моделе:

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

    
    public function loging($describe){
        $this->time = time();
        $this->user_id = Yii::app()->user->isGuest?0:Yii::app()->user->id;
        $this->controller = Yii::app()->controller->id;
        $this->ip = Yii::app()->request->userHostAddress;
        $this->action = Yii::app()->controller->action->id;
        $this->describe = $describe;
        $this->save());
    }
Save проходит нормально, но в БД ничего не пишется, потому что генерируется такой SQL запрос:

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

UPDATE `adm_logs` SET `time`=1355253697, `user_id`=0, `controller`='site', `ip`='127.0.0.1', `action`='index', `describe`='LOGIN ERROR: username:11 password:11' WHERE `adm_logs`.`id` IS NULL

Я понимаю, что создавать запись через UPDATE, а не INSERT INTO это не баг, а фича фреймворка, но всё же как переделать в данном случае на INSERT не сильно говнокодя существующий код?

Есть идея сделать прямой INSERT в таблицу через DAO и засунуть всё это в новый класс в компоненты, но хотелось бы узнать есть ли возможность INSERT'ить через AR!?

P.S. The ARCHIVE engine supports INSERT and SELECT, but not DELETE, REPLACE, or UPDATE. It does support ORDER BY operations, BLOB columns, and basically all but spatial data types.
yan
Сообщения: 942
Зарегистрирован: 2011.03.23, 09:28
Откуда: Уфа

Re: MySQL ARCHIVE Storage Engine

Сообщение yan »

модель как создаете? $this->isNewRecord в методе чему равно?
Аватара пользователя
lancecoder
Сообщения: 2532
Зарегистрирован: 2012.06.26, 17:16

Re: MySQL ARCHIVE Storage Engine

Сообщение lancecoder »

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

//CDbCommand
/**
     * Creates and executes an INSERT SQL statement.
...
     */
    public function insert($table, $columns)
    {
...
        $sql='INSERT INTO ' . $this->_connection->quoteTableName($table)
...
    }
о какой фиче вы говорите?
Gl00mY_ZeiZ
Сообщения: 13
Зарегистрирован: 2012.09.28, 22:43

Re: MySQL ARCHIVE Storage Engine

Сообщение Gl00mY_ZeiZ »

lancecoder писал(а):о какой фиче вы говорите?
Об AR.

Всё ок. Не сразу догадался, что через AR это делать глупо. Уже вынес в компоненты, всё работает прямым

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

Yii::app()->db->createCommand($sql)->execute();
Спасибо. Это и требовалось. По привычке через Gii сделал модель, и начал играться с ней. Написал раньше, чем подумал. :evil:

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

<?php
class Logs
{
    public static function logging($describe = NULL){
        $time = time();
        $user_id = Yii::app()->user->isGuest?0:Yii::app()->user->id;
        $controller = Yii::app()->controller->id;
        $ip = Yii::app()->request->userHostAddress;
        $action = Yii::app()->controller->action->id;
        $describe = $describe;

        $sql = "INSERT INTO adm_logs VALUES ('', $time, $user_id, '$ip', '$controller', '$action', '$describe')";
        Yii::app()->db->createCommand($sql)->execute();
    }
}

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

Logs::logging('LOGIN SUCCESS');
Аватара пользователя
lancecoder
Сообщения: 2532
Зарегистрирован: 2012.06.26, 17:16

Re: MySQL ARCHIVE Storage Engine

Сообщение lancecoder »

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

public function save($runValidation=true,$attributes=null)
	{
		if(!$runValidation || $this->validate($attributes))
			return $this->getIsNewRecord() ? $this->insert($attributes) : $this->update($attributes);
		else
			return false;
	}
issue вам бы написать, чтобы включили "фичу" в yii5
Ответить