エイブリッジでは、Web開発の際、開発言語にPHP、フレームワークによくLaravelを使用しています。
いろいろあるPHPフレームワークの中で世界でもっとも人気であると言っても良いと思います。
そこで、知っているとちょっと便利なテクニックを紹介したいと思います。
(Laravel8をベース)
■データ取得編
日付で抽出
User::whereDate('created_at', '2021-11-11')->get();
年で抽出
User::whereYear('created_at', '2021')->get();
月で抽出
User::whereMonth('created_at', '11')->get();
日で抽出
User::whereDay('created_at', '11')->get();
NULLは最後になるようにソートする
Post::orderByRaw('published_at IS NULL ASC')
->orderBy('published_at')->get();
->orderBy('published_at')->get();
日付で整列
// 未指定の場合はcreated_atの降順となる。
Post::latest()->get();
// カラム名を指定するとそのカラムの降順となる。
Post::latest('published_at')->get();
Post::latest()->get();
// カラム名を指定するとそのカラムの降順となる。
Post::latest('published_at')->get();
Modelのタイムスタンプのみを更新
User::find(1)->touch();
JSON配列を検索する
/*
+-----------------------------------------------------------------------------------------------+
| id | tags |
+-----------------------------------------------------------------------------------------------+
| 1 | ["Android","iOS","Web"] |
+-----------------------------------------------------------------------------------------------+
*/
$tag = 'Web';
$posts = Post::whereRaw("JSON_CONTAINS(tags,'["{$tag}"]')")->get();
/*
+-----------------------------------------------------------------------------------------------+
| id | tags |
+-----------------------------------------------------------------------------------------------+
| 1 | [{"id":1,"tag":"Android"},{"id":2,"tag":"iOS"},{"id":2,"tag":"Web"}] |
+-----------------------------------------------------------------------------------------------+
*/
$tag = 'Web';
$posts = Post::whereRaw("JSON_CONTAINS(tags,'{"tag":{$tag}}')")->get();
+-----------------------------------------------------------------------------------------------+
| id | tags |
+-----------------------------------------------------------------------------------------------+
| 1 | ["Android","iOS","Web"] |
+-----------------------------------------------------------------------------------------------+
*/
$tag = 'Web';
$posts = Post::whereRaw("JSON_CONTAINS(tags,'["{$tag}"]')")->get();
/*
+-----------------------------------------------------------------------------------------------+
| id | tags |
+-----------------------------------------------------------------------------------------------+
| 1 | [{"id":1,"tag":"Android"},{"id":2,"tag":"iOS"},{"id":2,"tag":"Web"}] |
+-----------------------------------------------------------------------------------------------+
*/
$tag = 'Web';
$posts = Post::whereRaw("JSON_CONTAINS(tags,'{"tag":{$tag}}')")->get();
■Eloquent編
Modelの変更された項目を確認する
$user = App\Models\User::first();
$user->name = ’taro yamada’;
$user->age = 30;
$result = $user->getChanges();
logger($result);
/* 結果:
array(
"name" => "taro yamada", "age" => 30
);
*/
$user->name = ’taro yamada’;
$user->age = 30;
$result = $user->getChanges();
logger($result);
/* 結果:
array(
"name" => "taro yamada", "age" => 30
);
*/
Modelの元の値を確認する
$user = App\Models\User::first();
logger($user->name);
// 結果:hanako yamada
$user->name = ’taro yamada’;
$result = $user->getOriginal('name');
logger('original: '.$user->name);
// 結果:hanako yamada
logger($user->name);
// 結果:hanako yamada
$user->name = ’taro yamada’;
$result = $user->getOriginal('name');
logger('original: '.$user->name);
// 結果:hanako yamada
属性のキャスト
モデルでキャストを設定しておくと、指定した型で返却されます。
例えば、日付項目に文字列で日付を設定しても、getするときは日付型で返却されます。
class Post extends Model
{
protected $casts = [
'category_no' => 'integer'
'published_at' => 'datetime'
];
}
{
protected $casts = [
'category_no' => 'integer'
'published_at' => 'datetime'
];
}
インクリメント/デクリメント
$user = User::find($id);
// インクリメント(+1)
$user->increment('login_count');
// デクリメント(-1)
$user->decrement('login_count');
// インクリメント(+5)
$user->increment('login_count', 5);
// デクリメント(-5)
$user->decrement('login_count', 5);
// インクリメント(+1)
$user->increment('login_count');
// デクリメント(-1)
$user->decrement('login_count');
// インクリメント(+5)
$user->increment('login_count', 5);
// デクリメント(-5)
$user->decrement('login_count', 5);