Для получения полного доступа
зарегистрируйтесь.
RSS

Все сниппеты с тэгом «db»



Denis Rudov
  • Репутация: 4
  • Сниппеты: 2
  • Ревизии: 0

Иногда хочется обновить все модели БД одной коммандой. Для этого написал небольшую комманду для этого и запускаю ее каждый раз после миграций

./yii db

обновит все базовые модели и если нужно создаст потомков в @app/models/

class DbController extends Controller
{
    protected $tablePrefix;
    protected $tables;

    public function init()
    {
        $this->tablePrefix = \Yii::$app->db->tablePrefix;
        $this->tables = \Yii::$app->db->createCommand('show tables')->queryColumn();
        parent::init();
    }


    public function actionIndex()
    {

        $prefix = $this->tablePrefix;

        foreach ($this->tables as &$table) {
            $name = str_replace($prefix, '', $table);
            $modelName = Inflector::camelize($name);
            $baseModelName = 'Base' . $modelName;
            $command = './yii gii/model --useTablePrefix=1 --tableName=' . $table . ' --modelClass=' . $baseModelName . ' --interactive=0 --enableI18N=1 --overwrite=1';
            @exec($command);

            $modelFile = \Yii::getAlias('@app/models/' . $modelName . '.php');
            if (!file_exists($modelFile)) {
                $this->createFile($modelFile, $modelName, $baseModelName);
            }
        }


    }


    private function createFile($modelFile, $modelName, $baseModelName)
    {
        $date = \Yii::$app->formatter->asDatetime(time(), 'MM/dd/yyyy hh:mm:ss');
        $template = <<<TEMPLATE
<?php
/**
 * Created by DBCommand.
 * User: Any User
 * Date: {$date}
 *
 */

namespace app\models;



class {$modelName} extends {$baseModelName}
{


}

TEMPLATE;
        $fp = fopen($modelFile, 'w+');
        fputs($fp, $template);
        fclose($fp);

    }


}
Gravatar image
Roman
  • Репутация: 1
  • Сниппеты: 2
  • Ревизии: 0

Формирует строку для запроса на вставку данных в базу - multiple INSERT из ассоциативного двумерного массива PHP. Чтобы одним запросом "вставить" массив в базу.

    function dbBuildInsertForManyRows($table, array $array) {
        $str = "INSERT INTO $table "; $strn = ''; $strv = array();
        foreach($array as $vals) {
            $strn = "(";
            $_strv = '(';
            if(!is_array($vals)) {throw new Exception('Two dimension array is incorrect.');}
            while(list($name, $value) = each($vals)) {
                if(is_bool($value)) {$strn .= "$name,"; $_strv .= ($value ? "true" : "false").","; continue;};
                if(is_string($value)) {$strn .= "$name,"; $_strv .= "'$value',"; continue;}
                if(!is_null($value) and ($value !== "")) {$strn .= "$name,"; $_strv .= "$value,"; continue;}
            }
            $_strv[strlen($_strv) - 1] = ')';
            $strn[strlen($strn) - 1] = ')';
            $strv[] = $_strv;
        }
        $str .= $strn." VALUES \r\n".implode(", \r\n", $strv);
        return $str;
    }