Yii2のDB Migrationを使ってテーブル作成 その3 -batch insert-

Yii2のDB Migration最終回!
最後はデータのinsertを行います。
データを1つずつinsertしてもいいんですが、
通常1つだけデータをinsertするってことはないので、
初めからBatch Insertを行います。
通常のSQLでいうバルクインサートです。
記述方法は

     $columns = array('id',
       'title',
       'content',
       'sub_table_id'
     );
     $values = array(
       array(1,
         'Title1',
         'これは1つ目',
         1,
       ),
       array(2,
         'Title2',
         'これは2つ目',
         1,
       ),
     );
     $this->batchInsert('tablename', $columns, $values);

をその2で作成したファイルに追記

<?php

use yii\db\Schema;
use yii\db\Migration;

class m150620_123401_create_tablename_table extends Migration
{
    public function up()
    {
        $this->createTable('tablename', [
            'id' => Schema::TYPE_PK,
            'title' => Schema::TYPE_STRING . ' NOT NULL',
            'content' => Schema::TYPE_TEXT,
            'sub_table_id' => Schema::TYPE_INTEGER,
        ]);
        $this->addForeignKey('fkey_tablename_sub_table_id', 'sub_table', 'sub_table_id', 'sub_table','id');
        $this->createIndex('tablename_title_index', 'tablename', 'title');
     //データinsert
     $columns = array('id',
       'title',
       'content',
       'sub_table_id'
     );
     $values = array(
       array(1,
         'Title1',
         'これは1つ目',
         1,
       ),
       array(2,
         'Title2',
         'これは2つ目',
         1,
       ),
     );
     $this->batchInsert('tablename', $columns, $values);
    }

    public function down()
    {
        $this->dropTable('tablename');
    }
}

これで初期テーブル作成コマンド用のファイルの準備が完了しました。
あとは下記を実行すると・・・

yii migrate/to m150620_123401_create_tablename_table

テーブルが作成されて、外部キー制約、インデックス、データまで準備されちゃてます!
しかも、このファイルでDB作成用のSQLは不要!
いやー便利便利。

Yii2のDB Migrationを使ってテーブル作成 その2 -index,外部キー制約-

Yii2のDB Migrationのその2。
今回はindexの貼り方、外部キー制約の設定、データ投入を行う。
前回の記事で作成した
m150620_123401_create_tablename_table.phpというファイルを触っていきます。

<?php

use yii\db\Schema;
use yii\db\Migration;

class m150620_123401_create_tablename_table extends Migration
{
    public function up()
    {
        $this->createTable('tablename', [
            'id' => Schema::TYPE_PK,
            'title' => Schema::TYPE_STRING . ' NOT NULL',
            'content' => Schema::TYPE_TEXT,
            'sub_table_id' => Schema::TYPE_INTEGER,
        ]);
    }

    public function down()
    {
        $this->dropTable('tablename');
    }
}

現在は上記のようにテーブルの作成と削除だけが設定されています。
まずは外部キー制約の設定を行います。
外部キー制約で使うカラムsub_table_idを追加しています。
今回の例ではsub_tableのidを対象に設定します。

$this->addForeignKey('fkey_tablename_sub_table_id', 'tablename', 'sub_table_id', 'sub_table','id');

外部制約キーの名前(任意)、自身のテーブル名、自身のカラム、制約対象テーブル名、制約対象カラムの順に記載します。
この一文をcreateTableの下に追記します。

<?php

use yii\db\Schema;
use yii\db\Migration;

class m150620_123401_create_tablename_table extends Migration
{
    public function up()
    {
        $this->createTable('tablename', [
            'id' => Schema::TYPE_PK,
            'title' => Schema::TYPE_STRING . ' NOT NULL',
            'content' => Schema::TYPE_TEXT,
            'sub_table_id' => Schema::TYPE_INTEGER,
        ]);
        $this->addForeignKey('fkey_tablename_sub_table_id', 'sub_table', 'sub_table_id', 'sub_table','id');
    }

    public function down()
    {
        $this->dropTable('tablename');
    }
}

次にtitleにindexを貼ってみましょう。

$this->createIndex('tablename_title_index', 'tablename', 'title');

indexの名前(任意)、テーブル名、対象のカラムの順に記載します。
この一文をcreateTableの下に追記します。

<?php

use yii\db\Schema;
use yii\db\Migration;

class m150620_123401_create_tablename_table extends Migration
{
    public function up()
    {
        $this->createTable('tablename', [
            'id' => Schema::TYPE_PK,
            'title' => Schema::TYPE_STRING . ' NOT NULL',
            'content' => Schema::TYPE_TEXT,
            'sub_table_id' => Schema::TYPE_INTEGER,
        ]);
        $this->addForeignKey('fkey_tablename_sub_table_id', 'sub_table', 'sub_table_id', 'sub_table','id');
        $this->createIndex('tablename_title_index', 'tablename', 'title');
    }

    public function down()
    {
        $this->dropTable('tablename');
    }
}

これでindexが作成されます。

Yii2のDB Migrationを使ってテーブル作成 その1 -createTable-

最近Yii2を触っているので遊びながらやったことをメモ。

Yii2でサイト構築する際にまず行うこと・・・
DBのテーブル作成を行う人が多いと思います。
SQLをバージョン管理してもいいんですが、
折角なのでDB Migrationを使ってコンソールからコマンド叩いてテーブルを構築します。
※DBは作成済みでyiiコマンドを実行出来る状況になっていることが前提

yii migrate/create create_tablename_table

上記コマンドを実行すると
m150620_123401_create_tablename_table.phpというファイルが
@app/migrations以下に作成されます。
ファイル名は作成日時を使って

m<YYMMDD_HHMMSS>_<Name>.php

となってます。
このファイルを開いてみると

<?php

use yii\db\Schema;
use yii\db\Migration;

class m150620_123401_create_tablename_table extends Migration
{
    public function up()
    {
    }

    public function down()
    {
        echo "m150620_123401_create_tablename_table cannot be reverted.\n";
        return false;
    }
}

このファイルを修正していきます。

<?php

use yii\db\Schema;
use yii\db\Migration;

class m150620_123401_create_tablename_table extends Migration
{
    public function up()
    {
        $this->createTable('tablename', [
            'id' => Schema::TYPE_PK,
            'title' => Schema::TYPE_STRING . ' NOT NULL',
            'content' => Schema::TYPE_TEXT,
        ]);
    }

    public function down()
    {
        $this->dropTable('tablename');
    }
}

これだけです。
up()がテーブル作成時に使用されるfunction
down()がテーブル削除時に使用されるfunctionになっています。

テーブルを作成するにはコンソールから

yii migrate/to m150620_123401_create_tablename_table

これでtablenameっていうテーブルが作成されます。
カラムはidがプライマルキー、titleがSTRINGでNOT NULL、contentがtextになっています。

テーブルを削除するにはコンソールから

yii migrate/down

このコマンドで最も最近作成されたテーブルが削除されます。
ちなみにこのコマンド実行するとどのテーブルを削除するか確認する画面が出てくるので、
削除対象のテーブルを確認してから削除を実行出来ます。

SpotifyのAPIを試す

日本ではサービスの開始が始まる始まると言いながら全く始まりそうにないSpotifyですが、APIは日本からも普通に使えたりします。
音楽好きとしては日本からの利用がこんなにあるんだよ!ってアピールして日本でのサービス開始を促したいところ(大げさ)

https://developer.spotify.com/web-api/

ここから利用出来るAPIを探してきます。
この中でもSpotifyにどんだけのアーティストが登録しているのか気になります。
なので、ここはSearch for an Itemってのを試します。

https://developer.spotify.com/web-api/search-item/

試しに

https://api.spotify.com/v1/search?query=a*&offset=0&limit=1&type=artist

を投げると

{
“artists” : {
“href” : “https://api.spotify.com/v1/search?query=a*&offset=0&limit=1&type=artist”,
“items” : [ {
“external_urls” : {
“spotify” : “https://open.spotify.com/artist/1vCWHaC5f2uS3yhpwWbIA6”
},
“followers” : {
“href” : null,
“total” : 3941093
},
“genres” : [ “big room”, “edm”, “electro house”, “house”, “progressive electro house” ],
“href” : “https://api.spotify.com/v1/artists/1vCWHaC5f2uS3yhpwWbIA6”,
“id” : “1vCWHaC5f2uS3yhpwWbIA6”,
“images” : [ {
“height” : 686,
“url” : “https://i.scdn.co/image/886965d33b3e1e469d24f3a8e44374b1e19d3055”,
“width” : 1000
}, {
“height” : 439,
“url” : “https://i.scdn.co/image/b34ff69e37a8e5ceed9568b1e817b88d6c2691dd”,
“width” : 640
}, {
“height” : 137,
“url” : “https://i.scdn.co/image/5a4f940347ac9bc42405a3c66531b7c1cb25efa0”,
“width” : 200
}, {
“height” : 44,
“url” : “https://i.scdn.co/image/3e77006dc092166fee8b9004e4e1e1fabc045d93”,
“width” : 64
} ],
“name” : “Avicii”,
“popularity” : 94,
“type” : “artist”,
“uri” : “spotify:artist:1vCWHaC5f2uS3yhpwWbIA6”
} ],
“limit” : 1,
“next” : “https://api.spotify.com/v1/search?query=a*&offset=1&limit=1&type=artist”,
“offset” : 0,
“previous” : null,
“total” : 469391
}
}

とAviciiさんが返されました。
ついでに検索した「a」がつくアーティストの総数はなんと「469391」!!(2015/06/07現在)
すごいさすがSpotify。
で、結局何が言いたかったかと言うと
「早く日本でもサービスを開始してください。お願いします。Spotifyさん!」ってことです。

PHPStormでYii2インストール後に自動生成されるContactページでPNGエラー

環境
Mac OS X Yosemite 10.10.3
PhpStorm 8.0.3
PHP 5.6.9
ブラウザ PHP build in browser

スクリーンショット 2015-06-04 23.20.44
上記のような画像のエラーが出ました。
ようはこれPNGをサポートしたExtensionがPHPに設定されてないよっていうエラー
なので、サクッとエラーメッセージに書いてある通り
ImageMagickかGDを使えるようにしよう!

1.ImageMagickのインストール

で、brewでImageMagickをインストールすると上手く行かない…
頑張ってやってみたけど、やはりなんかおかしい。
ググってもbrewでインストールするとはまりどこが多いと書いてある始末。

ここは頭を切り替えてインストーラーからインストールする

http://cactuslab.com/imagemagick/

ここは特に難しいことはなく普通にインストーラーにしたがってインストール。

2.Imagickのインストール

さて、これもググるとPECLでインストールしろって書いてあるけど、
これでやるとエラーが発生。
ここはさっきえらい目にあったbrewさんで懲りずにインストールする

brew install php56-imagick

3.imagick.soのコピー

この状態でYii2のContactにアクセスして問題なく表示されれば完了。
まだエラーが出ている場合は

cp /usr/local/Cellar/php56-imagick/3.1.2/imagick.so PHPがインストールされたディレクトリ/extensions/imagick.so

など自分の環境に合わせてextensionsにコピーする。

4.phpのimagick.so extensionsを有効にする

echo extension=imagick.so > PHPがインストールされたディレクトリ/etc/conf.d/imagick.ini

これでYii2のContactページにアクセスすると問題なく表示されている(はず)