--- title: Laravel4, MariaDB, migration tags: Laravel mariadb MySQL Ubuntu PHP author: k_o_gj slide: false --- Laravel4でdatabase接続を行い、migrationを使ってテーブル作成したり、テーブルから値を取ったりしてみる OS:Ubuntu14.04 DB:MariaDB 10.0.11 InnoDB php:5.6.0 thinkpad T440p #MariaDBへの接続設定 laravel_test/app/config/database.phpに設定,mysqlのセクションを変更する driverはmysql, unix_socketの設定にsockファイルの位置を明記すること defaultがmysqlになっていること ```app/config/database.php 'default' => 'mysql', ・・・ 'mysql' => array( 'driver' => 'mysql', 'host' => 'localhost', 'database' => 'larabel_sample', 'unix_socket' => '/home/user/mariadb_work/tmp/mariadb.sock', 'username' => 'hogehoge', 'password' => 'fugafuga', 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => '', ), ``` mariadb側で指定したデータベースを作成しておく ``` MariaDB [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | larabel_sample | | my_test | | mysql | | performance_schema | | sakila | | test | +--------------------+ ``` #migrationの作成 ``` ~/laravel_test$ php artisan migrate:make create_users_table Created Migration: 2014_09_21_213121_create_users_table Generating optimized class loader Compiling common classes Compiling views ``` app/database/migrationの下にmigrationファイルができているので修正 function up()とdown()の中を記述 ```2014_09_21_213121_create_users_table.php increments('id'); $table->string('email')->unique(); $table->string('name'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { // Schema::drop('users'); } } ``` # migrationの実行 artisan migrateコマンドで実行 ``` ~/laravel_test$ php artisan migrate ************************************** * Application In Production! * ************************************** Do you really wish to run this command? Migrated: 2014_09_21_213121_create_users_table ``` テーブル確認 ``` MariaDB [larabel_sample]> show tables; +--------------------------+ | Tables_in_larabel_sample | +--------------------------+ | migrations | | users | +--------------------------+ 2 rows in set (0.00 sec) | users | CREATE TABLE `users` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `email` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`id`), UNIQUE KEY `users_email_unique` (`email`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci | ``` プライマリキーやインデックスの付け方は以下を参考 http://laravel4.kore1server.com/docs/schema http://laravel.com/docs/schema #foobarテーブルを作ってみる カラムはfoo,bar,bazの3つ、それぞれint型 primarykeyはfooで(bar,baz)がindexであるようなテーブル ##migration作成 ``` ~/laravel_test$ php artisan migrate:make create_foobar_table Created Migration: 2014_09_21_220043_create_foobar_table Generating optimized class loader Compiling common classes Compiling views ``` ##定義作成 ```app/database/schema/***_create_foobar_table.php ・・・ public function up() { // Schema::create('foobar',function($table) { $table->integer('foo'); $table->integer('bar'); $table->integer('baz'); $table->primary('foo'); $table->index(array('bar','baz')); }); } /** * Reverse the migrations. * * @return void */ public function down() { // Schema::drop('foobar'); } ``` ##migrateの実行 ``` ~/laravel_test$ php artisan migrate | foobar | CREATE TABLE `foobar` ( `foo` int(11) NOT NULL, `bar` int(11) NOT NULL, `baz` int(11) NOT NULL, PRIMARY KEY (`foo`), KEY `foobar_bar_baz_index` (`bar`,`baz`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci | ``` ついでにデータを入れておく ``` MariaDB [larabel_sample]> select * from foobar; +-----+-----+-----+ | foo | bar | baz | +-----+-----+-----+ | 1 | 1 | 1 | | 4 | 1 | 1 | | 2 | 1 | 3 | | 3 | 3 | 5 | +-----+-----+-----+ ``` #モデルの作成 デフォルトではidというカラムを主キーとして使用することになっているので 主キーがidでない場合は$primaryKeyを書き換えておくこと ```app/models/Foobar.php pkeyとindexを指定して取ってくる関数を作成 where('foo', '=', $foo)->get(); return $foobar_rec; } public function get_by_bar_baz($bar,$baz) { $recs = $this->where('bar','=',$bar)->where('baz','=',$baz)->get(); return $recs; } } ``` #コントローラの作成 ここではindexの要素を指定して値をとってくる関数を指定 最後のwithはview内で$recsをfoobar_recsとして扱えるようにするという意味 ```app/controllers/FoobarController.php get_by_bar_baz($bar,$baz); return View::make('foobar/foobar')->with('foobar_recs',$recs); } } ``` #Routeの作成 デフォルト値を使用するパターンと値をURIで指定するパターン laravel.dev:8080/foobar_look/1/1とかlaravel.dev:8080/foobarでアクセスが出来る ```app/routes.php Route::get('foobar_look','FoobarController@get_val'); Route::get('foobar_look/{bar}/{baz}','FoobarController@get_val'); //上記二行の代わりに下記のように書いていい //Route::get('foobar_look/{bar?}/{baz?}','FoobarController@get_val'); ``` #viewsの作成 view側では渡されたレコードをひとつずつ見ていき、foo(プライマリキー)の値を単に表示するだけ ``` ~/laravel_test/app/views/foobar$ ls foobar.blade.php layout.blade.php ``` ```foobar.blade.php @extends('foobar/layout') @section('content') @foreach($foobar_recs as $record)

{{ $record->foo }}

@endforeach @stop ``` ```layout.blade.php

FooBarテーブル

@yield('content') ``` laravel.dev:8080/foobar_look/1/1とかlaravel.dev:8080/foobarでアクセスが出来る