ふたりはララベル (Laravel PHP Framework)

PHPフレームワークのLaravelの体験記を書いていきます。こんなタイトルのブログですが萌え系アニメは一秒たりとも観たことがありません。

Eloquent

長くなったLaravelのModelを分割

長くなったLaravelのModelを分割する方法の一つとして、私は上位モデルを使うときがある。 Titleモデルのうち、Updateに関する機能を独立させるときはこんな感じ。テーブル名を指定するのがポイント。 class TitleUpdate extends Title { protected $table =…

LaravelのEloquentでwhereInを使う

LaravelのEloquentでwhereInを使う。例えば4つのIDから最小の値段を取得する場合。 $nedan = Title::whereIn('id',[10,11,12,13])->min('nedan');

LaravelのEloquentで複数条件を指定する

Eloquentのwhereメソッドは重ねることもできる。 Title::where('type', '=', $type)->where('rank', '>', '100')->get();「orWhere」というのもある。 Title::where('type', '=', $type)->orWhere('rank', '>', '100')->get();

Eloquentを使ってfindの前後を取得する

Eloquentを使ってfindの前後を取得するテクニックがあった。 How to get previous / next records in DB with Eloquent. (Page 1) / Laravel 3.x Code Samples / Laravel Forumsなるほど、モデルにそういうメソッドを追加すればいいのか。idだったら上記のテ…

LaravelのEloquentでID値が指定できない

下記のようにidを指定してcreate()しても、指定した数ではなくて通番になっていた。 $name = Name::find(4); Title::create(['id' => $name->id])モデル上でidを保護しているのが原因だった。

LaravelのEloquentでテーブルを消去する

LaravelのEloquentからtruncateも実行できる。 Mymodel::truncate();

Eloquentでmaxを使う

めっちゃ簡単だった。 Title::max('vote');

Laravelでis not nullを使う

LaravelのEloquentでは Title::where('year','is not',null)->get();という書き方はうまく動作しない。 Title::whereNotNull('year')->get();が正しい。

Laravel5(開発版)でモデルを使う

Laravel5 devだとモデルが今まで通りに使えなくなっていた。名前空間「\App」を指定しなきゃダメみたい。

Eloquentでテーブルの別名を設定する

Eloquentでテーブルの別名を設定する場合。 class SentryGroup extends Eloquent { protected $table = auth_groups'; public $timestamps = false; protected $guarded = ['id']; }

DB::tableではtoArrayが使えない

リンク先に書いてあるけどDB::tableではtoArrayが使えない。Eloquentを使うしかない。 DB query builder toArray() laravel 4 - Stack Overflow

Laravelでペジネーションとgetを同時に使う

getメソッドは欲しい要素だけを手に入れることができる。 $titles = Title::get(['id', 'title']);これをペジネーションと組み合わせたい時は $titles = Title::paginate(10);第2引数に配列を渡す。 $titles = Title::paginate(10,['id', 'title']);

Eloquentのgetメソッドの結果が0件であることを確認する

get()やall()の結果が0件というか空であることはisEmpty()で確認できる。 $tmps = Title::all(); if($tmps->isEmpty()){ return Redirect::back(); }

Eloquent上で関連付けし、さらにWhere句を使う

Eloquent上で関連付けし、さらにWhere句を使う時は、useを使って$where句を渡す。以下の例はTitleモデルとNameモデルを関連付けして、さらにWhere句で絞込をしている。 $where = "country='Japan'"; $lists = Title::whereHas('name', function($q) use ($wh…

listsメソッドの結果に空白を足す

連想配列を作るのに便利なlists()メソッド。実際に使うときは連想配列に空白も欲しい。そういうときは普通に配列を足せばOK。 $houses = ['0' => ''] + House::all()->lists('town', 'id') ;

テーブルの要素を取得する

MySQL限定だけど、テーブルの要素を取得する方法。「Field」はMySQL独特の表現だ。 $title = new Title; $query = 'SHOW COLUMNS FROM ' . $title->getTable(); foreach (DB::select($query) as $column) { $columns[] = $column->Field; } これで$columnsの…

Eloquentでテーブル名を取得する

Eloquentを使えばテーブル名を取得できる。 $title = new Title; $title->getTable();

Laravelで'タグ'=>'タグ'のような配列を作る

Laravelで'タグ'=>'タグ'のような配列が欲しいときがあるかもしれない。以下の様な場合だ。 <select name="tag"> <option value="タグ">タグ</option> <select>Viewはこうすれば良い。 {{ Form::select('tag', $tags, null) }}Controllerではlists()を使う。 $tags = Tag::lists('name','name');</select></select>

show()の引数で文字列を使う

Controllerのshowのidに数字が来たら普通にfind、文字列が来たらwhereにする。 public function show($id) { if (is_numeric($id)) { $tag = Tag::find($id); } else { $tag = Tag::where('name', '=', $id)->first(); } }

joinとlistsを併用する

listsメソッドの引数の文字列には「.」が使えない。そのためjoinとlistsを併用したい時はASで名前を変える。 というかEloquentでもjoinができたのか。 $lists = Member::select('members.name AS name', 'childs.id AS id') ->join('childs', 'childs.member…

Laravelのlistsメソッドが超便利

クエリーの結果を連想配列にしてくれるlistsメソッド。今まで知らなかったことを後悔するレベルで便利だった。例えばidをキー、nameを値にした連想配列が欲しいときは以下のようにする。 $names = Member::all()->lists('name','id');

function($q)に変数を渡す

function($q)またはfunction($query)でfunction内に変数を渡すにはuseを使う。 $where='yen>100'; $lists = Yasai::whereHas('nedan', function($q) use($where) { $q->where($where); })->get();

Eloquentで関連付けられたテーブルの情報を取得する

野菜テーブルと値段テーブルが別れていたとして、このテーブルをEloquentで結合したい。yasai idname 1トマト 2きゅうり 3大根 nedan idyen 1150 260 3200 以下の3ステップで結合ができる。 1:Eloquentで関連付ける class Yasai extends Eloquent { public $…

EloquentでWhereを重ねる

EloquentのwhereRawメソッドを使う他に、whereメソッドを重ねることもできる。こちらのほうが安全。 Title::where('type', '=', $type)->where('id', '>', '100')->get();

LaravelのEloquentはデータの変更が無いとupdated_atを更新しない

LaravelのEloquentはデータの変更が無いとupdated_atを更新しない。便利な仕様だけど、どうしても更新してほしければupdated_atにゴミデータを入れよう。 $title->updated_at = null; $title->save(); ツイッター上の指摘で気がついたけど $title->touch();…

whereメソッドで結果を一件だけ取得したいとき

find()のように結果を一件だけ取得したいときはfirst()を使う。 $title = Title::where('name','=',$name)->first();

自作のパッケージ内でEloquentを使う

自作のパッケージ内、または名前空間内でEloquentを使う場合は名前空間を指定する。単に「\」をつけるだけ。 $titles = \Title::get();

LaravelのEloquentで特定のカラムだけを取得したい

SQL文で言うところの select `name`,`address` from title; をLaravelのEloquentで実現したい場合は、getメソッドを使う。引数が配列になることに注意。Eloquentの結果をただの配列にするtoArrayも併用すると便利。 $titles = Title::get(['name','address']…

LaravelのEloquentでLIKEを使う

LaravelのEloquentでSQL文のLIKE演算子を使いたい場合は、whereの第2引数をLIKEにすればよい。 $titles = Title::where('tags', 'LIKE', "%$tagname\n%")->get()

Eloquent上でバリデーションを設定する

Laravelのバリデーション(入力値の検証)は大変便利という評判だけど、公式ドキュメント上だとコントローラー側でバリデーションする例が書いてある。それよりもEloquent上でバリデーションしたい。Eloquentの中にvalidateメソッドを作ってみた。 class Use…