Laravelの知ってると便利な機能

laravel
エイブリッジでは、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();

日付で整列

// 未指定の場合はcreated_atの降順となる。
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();

■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
);
*/

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

属性のキャスト
モデルでキャストを設定しておくと、指定した型で返却されます。
例えば、日付項目に文字列で日付を設定しても、getするときは日付型で返却されます。

class Post extends Model
{
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);
カテゴリーPHP