実践Laravel 基本編8 データベースアクセス(モデル)2

Posted: 2014-06-17 23:11 |  laravel 
今回はQueryBuilderを用いて、簡単なデータベースアクセスを実装してみます。
シンプルな行取得をする場合は下記の様になります。

    public function find($id, array $columns = ['*'])
    {
        return \DB::connection('master')->table($this->table)
            ->where($this->primary, $id)
            ->remember(120, $this->cacheKey . $id)->first($columns);
    }
DBファサードを使用して、connection()で接続するデータベースを指定します。
データベースが1つだけの場合は、接続先をapp/config/database.phpの'default'を任意の接続先名に指定すると
省略できます。
マスタースレーブ構成の場合や、複数のデータベースを使用している環境の場合は、
簡単に指定する事ができますので、覚えておくと便利です。
tableはFROM句で指定するテーブルになります。
QueryBuilderは、文字列がバッククォートで囲まれるため、
ASを使う場合は次の様に指定すると良いでしょう。
 
table("sample AS s")
WHEREやANDは、
whereをチェインメソッドで繋ぐ事で、内部的にANDへ変換されますので、
特に意識する事はありません。
whereの第一引数は、対象のカラム、
第二引数は、'='や'!='、'<'など条件を指定する事ができます。
特になければ、検索の値となります(idなど)
第三引数は、第二引数で検索条件が指定されている場合は、検索の値が入ります。

rememberはキャッシュの指定です。
rememberが指定されている場合は、指定した時間が経過されるまで検索結果を保持し、
新しいクエリが発行されません。
アクセスが多いサービスや、サイトのレスポンスを向上させる場合には必須となります。
rememberの第一引数は、キャッシュする時間(分単位)、
第二引数は、キャッシュのキーを指定できます。
行取得の場合は、それぞれがユニークとなる様なキーで保持する様にしましょう。
キャッシュの削除自体は、Cacheファサードを用いて次の様に記述します。
\Cache::forget('cacheKey');
情報の更新等が発生した場合に確実に実行される様にして下さい。
キャッシュが削除されないと、データ更新や削除時に画面等に反映されなくなります。

joinの場合は、通常のSQLとほぼ同等です。
join('a', 'a.sample_id', '=', 's.sample_id')
第五引数にjoinのタイプを指定する事ができます。
デフォルトはINNER JOINですが、LEFTやRIGHT、OUTERなどを指定する事ができます。
leftJoin()はそれ様に用意されていますが、joinのみで十分だと思います。
他にもほとんどのSQLを網羅した機能が用意されており、
必要最低限の記述だけでシンプルな処理を記述する事ができます。
下記の様なクラスを継承するだけで、単純なクエリーはいっさい記述しなくても発行できる様になります。
abstract class AbstractFluent implements FluentInterface
{
    /** @var array */
    protected $errors;

    /** @var string query cache key */
    protected $cacheKey;

    /** @var string table name */
    protected $table;

    /** @var string primary key */
    protected $primary = 'id';

    /**
     * add
     * @param array $attributes
     * @return mixed
     */
    public function add(array $attributes)
    {
        $attributes['created_at'] = Carbon::now()->toDateTimeString();
        $attributes['updated_at'] = Carbon::now()->toDateTimeString();
        return \DB::connection('sqlite')->table($this->table)->insertGetId($attributes);
    }

    /**
     * get all
     * @param array $columns
     * @return \stdClass
     */
    public function all(array $columns = ['*'])
    {
        return \DB::connection('sqlite')->table($this->table)->get($columns);
    }

    /**
     * required cache
     * @param $id
     * @param array $columns
     * @return mixed
     */
    public function find($id, array $columns = ['*'])
    {
        return \DB::connection('sqlite')->table($this->table)
            ->where($this->primary, $id)
            ->remember(120, $this->cacheKey . $id)->first($columns);
    }

    /**
     * @param $id
     * @return int
     */
    public function delete($id)
    {
        // cache forget
        \Cache::forget($this->cacheKey . $id);
        return \DB::connection('sqlite')->table($this->table)
            ->where($this->primary, $id)->delete();
    }

    /**
     * @param $id
     * @param array $attributes
     * @return int
     */
    public function update($id, array $attributes)
    {
        $attributes['updated_at'] = Carbon::now()->toDateTimeString();
        // cache forget
        \Cache::forget($this->cacheKey . $id);
        return \DB::connection('sqlite')->table($this->table)
            ->where($this->primary, $id)->update($attributes);
    }
}
サブクエリ等を用いた複雑なSQLの場合は、
EloquentやQueryBuilderを使用するより、ベーシックなクエリーで記述した方が早いと思いますので、
その場合はシンプルに記述して発行しましょう。
ベーシックな発行方法は下記の様になります。
 
        $sql = "SELECT * FROM users WHERE user_id = ?";
        $params = [$userId];
        \DB::connection()->select($sql, $params);
PDOを使用しているため、とてもシンプルです。


 

about ytake

執筆に参加しています


Laravel お役立ち情報

share



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

Categories

laravel 45

DTM 0

music 0

PHP全般 31

0

JAPAN 1

WORLD 1

javascript 4

RDBMS 1

NoSQL 1

NewSQL 1

Recent Posts

Ad

comments powered by Disqus

GitHub

Social Links

Author


クリエイティブ・コモンズ・ライセンス
Yuuki Takezawa 作『Ytake Blog』はクリエイティブ・コモンズ 表示 - 非営利 4.0 国際 ライセンス で提供されています。

© ytake/comnect All Rights Reserved. 2014