WinRoadのLaravel4初心者講座

次世代PHPフレームワークのLaravel4を初心者向けに解説して参ります。

Winroad徒然草の管理人がお届けします
データベースの基礎

データベースの基礎

このエントリーをはてなブックマークに追加

Laravel4がサポートしているデータベースシステムはMySQL、Postgres、SQLite、SQL Serverですが、本講座では、MySQLを使用して進めて参ります。

データベースの設定

Laravel4の初期設定でも説明しましたが、app/config/database.phpがデータベースのデフォルトの設定ファイルですので、必ず使用環境に合わせたフォルダにコピーしてから修正して下さい。(例:localフォルダ、lolipopフォルダ)。

クエリーの実行

データベースを操作するには、3つの方法があります。まず、SQL文を記述して、実行する方法。

基本例

//SELECTクエリーを実行する
$results=DB::select('select * from users where id=?',arry(1));

//INSERT文を実行する
DB::insert('insert into users(id,name) values (?,?)',array(1,'Nakada'));

//UPDATE文を実行する
DB::update('update users set votes=100 where name=?',array('Nakada'));

//DELETE文を実行する
DB::delete('delete from users');

//通常のSQL文を実行する
DB::statement('drop table users');

Fluentクエリービルダー

次に、Fluentクエリービルダーを使用して、データベースを操作する方法。※LaravelのFluentクエリービルダーは、アプリケーションをSQLインジェクション*攻撃から守るために、PDOパラメーターによるバインディングを使用します。バインドする文字列をクリーンにして渡す必要はありませんので安心です。初心者は、なるべくこのFluentクエリービルダーか、EloquentORMを使用するようにして下さい。

基本例

//テーブルから全レコードを取得する
$users=DB::table('users')->get();

//テーブルから1レコードを取得する
DB::table('users')->where('name','Nakada')->first();

//データ数を取得する
$users=DB::table('users')->count();

Eloquent ORM

最後に、Eloquent ORM*の使用による、美しくシンプルなアクティブレコードのデータ操作です。Eloquent ORMでは、それぞれのデータベーステーブルを関連する「モデル」と結びつけて使用します。

基本的な使用方法

上記の2つと違って、Eloquent ORMは使用する前に、Eloquentモデルを作成する必要があります。作成すると言っても一定の規約を守れば、とても簡単です。

  1. データベーステーブル名は小文字の複数形(例:users)にします。
  2. id名の主キーを作成します。
  3. update_atとcreate_atカラムを作成します。
  4. モデルは、app/models内に作成します。
  5. モデル名及びモデルファイル名は単数形のアッパーキャメル記述(例:User.php)にします。

上記の規約は、Eloquentモデルの作成を簡単にするための方法ですが、絶対ではありませんので、心配しないで下さい。只、上記規約を守れば、Eloquentモデルは下記のような簡単な記述で済みます。

<?php
class User extends Eloquent{}

それでは、Eloquent ORMの基本的な使用例を下記に記述しておきます。

基本例

//全モデルを取得する
$users=User::all();

//主キー1のレコードを取得する
$user=User::find(1);

//データ数を取得する
$cont=User::where('votes','>',100)->count();

複数代入

Eloquent ORMでは、デフォルトで複数代入*されないように保護されています。複数代入を使用するには、fillableかguardedプロパティをモデルに設定する必要があります。

基本例

//複数代入可能な属性を定義する
Protected $fillable=array('first_name','last_name','email');

//複数代入不可能な属性を定義する
protected $guarded=array('id','password');

//全属性を複数代入から保護する
protected $guarded=array('*');

リレーション

Eloquent ORMは、複数のデータベーステーブルの関連づけを簡単に行うことが出来ます。Laravel4では、4つの関連づけをサポートしています。

  • 1対1(hasOne,belongsTo)
  • 1対多(hasMany,belongsTo)
  • 多対多(belongsToMany)
  • 多様対応関係(morphTo,morphMany)

« »

コメント

  • ほげほげ より:

    いつもありがとうございます。
    フォームに続き、この簡潔で美しいコード・・・しかもSQL文を書くまでもなく直感的に安全にデータベーステーブルの情報を扱えるなんて・・・初心者ながらすっかりLaravelにはまりつつあります。

    3つ質問があります。

    (1)Eloquent モデル(例えばUsers.php)の作成前のデータベーステーブル(例えばusers)の作成について
    ユーザー情報のテーブルをphpMyAdminなどで作成する際、繰り返しの確認になりますが、
    ・テーブル名は小文字。
    ・必須カラム(項目名)はid(主キーの設定をする)、update_at、create_atの3つ。
    ・モデルの最初の英文字は大文字。
    でよろしいでしょうか?

    (2)複数代入について
    教えていただいた内容を再確認させていただくと、
    ・Eloquentモデル(例えばUsers.php)では基本的に一つのカラム(項目名:例えば氏名のみとか)しかデータベーステーブルとの間で情報をやり取りできない仕様になっている。
    ・Users.phpのソースコードの先頭部分に、fillableかguardedプロパティを記述すると、一時的に複数のカラム(項目名:名前とか、メールアドレスとか、その他このデータベーステーブルに対応するモデルファイルで扱う予定がある項目名)を扱えるようになる。

    という理解でよろしいでしょうか?

    (3)データベーステーブルのリレーションについて
    通常データベース側でリレーションを設定するような感覚を持っているのですが、仮にEloquentモデルでリレーションの設定を行えば、データベース側ではテーブル間のリレーションを設定する必要ないのでしょうか?
    (データベースの中にテーブルが単純に複数作成されており、テーブル間のリレーションは設定されていない状態。もしこれでよいなら、後々のシステム拡張の時にとても便利ですね^_^)
    それともやはりデータベース側でもリレーションを設定する必要があるのでしょうか?

    長々とすいません。
    初心者の質問恐れ入りますが、お時間のある時で構いませんのでご回答を頂けたら幸いです。

    引き続きよろしくお願いします。

  • ほげほげ より:

    (2)複数代入について
    http://laravel4.winroad.jp/faq/複数代入とは/
    の追加ありがとうございます。誤解しておりました。

    コーディング例による違いも説明していただき、複数代入の便利さの裏に潜むリスクがよくわかりました。

    基本的には複数代入は例外的に必要な部分だけ使用した方がいいですね(^。^)

    • nakada より:

      コメントありがとうございます。

      (1)については、基本的には、サイトに記載しているとおりです。只、Laravelはかなり自由なフレームワークですので、昔作成したデータベーステーブルとかも少しの設定で、簡単にEloqentモデルとして使用できるようになります。

      (3)については、データベース側でのリレーションの設定は必要になります。詳細は後日、サイトでお知らせしたいと思いますが、Laravelは少しの設定で、データベーステーブル間のデータのやりとりが簡単に出来るようになります。

    • nakada より:

      (1)について、記述が間違えていましたね。修正しました。
      データベース→データベーステーブル

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です