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になっていること
'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()の中を記述
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateUsersTable extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
//
Schema::create('users', function($table)
{
$table->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
定義作成
・・・
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を書き換えておくこと
pkeyとindexを指定して取ってくる関数を作成
<?php
class Foobar extends Eloquent{
protected $table = 'foobar';
protected $primaryKey = 'foo';
public function get_by_pkey($foo)
{
$foobar_rec = $this->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として扱えるようにするという意味
<?php
class FoobarController extends BaseController{
public function get_val($bar=1,$baz=1)
{
$FooBarModel = new Foobar;
$recs = $FooBarModel->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
@extends('foobar/layout')
@section('content')
@foreach($foobar_recs as $record)
<p>{{ $record->foo }} </p>
@endforeach
@stop
<html>
<body>
<h1>FooBarテーブル</h1>
@yield('content')
</body>
</html>
laravel.dev:8080/foobar_look/1/1とかlaravel.dev:8080/foobarでアクセスが出来る