BeginnerEngineerBlog
中の人
中の人

【laravel model cast 小ネタ】追加したフィールドをcastする

公開: 2022-12-18 00:17
更新: 2023-04-05 23:11
390
laravel6.x model cast
laravelのmodelの$castて結構利用すると思いますが、その小ネタです

こんにちは!

中の人です。

最近laravelのmodelのcastについて初めて知ったことがあったので紹介したいと思います!


SQLで追加したフィールド?をCASTする


なんて表現したらいいのかよくわからないのですが、要するにasで名前つけた値もmodelのcastプロパティでcastできましたので、紹介したいと思います!

ちなみにここで利用するアプリケーションはTutorialアプリケーションを利用します


Article.php


ということでArticleモデルで試してみます

一旦今のテーブルがどうなってるか見てみます


こんな感じです

📁 Tutorial/app/Article.php

...省略
protected $casts = [
    'date_created_at' => 'date',
];
...省略

はい、テーブルにないフィールド名をdateにキャストしてみます


SQL


そしたらArticlesを取得します


📁 Tutorial/app/Http/Controller/ArticleController.php

...省略
use Illuminate\Support\Facades\DB;
...省略
public function new (Request $request)
{
    $articles = Article::query()
        ->select(DB::raw('*, DATE(created_at) as date_created_at'))
        ->get();
...省略
articleを全部取得してcreated_atフィールドをDATE関数でYmdのみ取得します

で、デバッグしてみます

...省略
$articles = Article::query()
    ->select(DB::raw('*, DATE(created_at) as date_created_at'))
    ->get();
foreach ($articles as $article) {
    $date_created_at = $article->date_created_at;
}
...省略

date_created_atがCarbonのインスタンスになってますね!
こんな感じでテーブルのフィールドのないフィールドもキャストできます。

ちなみにcastに含めないとどうなるか見てみます

📁 Tutorial/app/Article.php

...省略
protected $casts = [
//     'date_created_at' => 'date', <- コメントアウト
];
...省略


Carbonではなく普通のstringで取得してるみたいですね!

また、取得するデータの中にdate_created_atがなければどうなるか見てみます

📁 Tutorial/app/Article.php

...省略
protected $casts = [
    'date_created_at' => 'date',
];
...省略

📁 Tutorial/app/Http/Controller/ArticleController.php

...省略
public function new (Request $request)
{
    $articles = Article::query()
        // ->select(DB::raw('*, DATE(created_at) as date_created_at')) <- コメントアウト
        ->get();
...省略



エラーはなく値がnullになってますね
ということで以上で紹介を終わります!


終わりに


まぁ、要するに、実際にテーブルにないフィールドでもcastプロパティに含めると、その値があればcastしてくれるし、なければnullになってエラーにもならないということですね!

へー(゚∀゚ )

bladeで使用したい値がテーブルのフィールドのままだと利用するの面倒だなということで、sqlで追加したフィールドがcastされてたら楽だなって思って試したらできました。

わっしょいヽ(゚∀゚ )

ということで誰かの参考になれば幸いです!

おつかれさまでした!
0
0
0
0
通信エラーが発生しました。
【広告】
似たような記事