質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

3591閲覧

Laravel Model内でデータを取得し文字列を返したい

退会済みユーザー

退会済みユーザー

総合スコア0

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2020/12/26 17:13

前提・実現したいこと

LaravelでModel(App\Profile)内でデータを取得し、指定したように文字列で返したいです。

具体的に言うと、Laravelで指定したカラムsex age is_adultから指定した文字列に返す様なものです。

例として、以下の様な場合は文字列で未婚男性31歳と返したいと思います。

カラム名データ
is_marriage0
sex0
age31

質問点

  • 下記の場合は、関数名の命名規則として何かあるのか調べたところミューテタというものの存在を知ったのですが、ドキュメントや他の記事を見る限り今回実装したいものとは異なる点があると思ったので、今回の関数名は特に指定をしなかったのですが、これで問題ないのでしょうか?

  • App\Profile.php内で自らのクラスであるProfileを呼び出してしまっているのですが、何かもっと良い方法はないでしょうか?

  • 根本的な修正が必要なのでしょうか?

該当のソースコード

PHP

1// App\Profile 2public static function getUserStatus($id) { 3 $profiles = Profile::find($id)->select('is_marriage', 'sex', 'age'); 4 $s[1] = $profiles['is_marriage'] == true ? '未婚' : '既婚'; 5 $s[2] = $profiles['sex'] === 0 ? '男性' : '女性'; 6 return $s[1].$s[2].$profiles['age'].'歳';

試したこと

上記コードを試してみました。

補足情報(FW/ツールのバージョンなど)

Laravel framework 6.x

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

php

1<?php 2 3namespace App; 4 5use Illuminate\Database\Eloquent\Model; 6 7/** 8 * Class Profile 9 * @package App 10 * 11 * @property string is_marriage 12 * @property string sex 13 * @property string age 14 */ 15class Profile extends Model 16{ 17 /** 18 * @return string 19 */ 20 public function getUserStatusAttribute(): string 21 { 22 return $this->is_marriage . $this->sex . $this->age; 23 } 24 25 /** 26 * @param mixed $value 27 * @return string 28 */ 29 public function getIsMarriageAttribute($value): string 30 { 31 return ($value) ? '既婚' : '未婚'; 32 } 33 34 /** 35 * @param mixed $value 36 * @return string 37 */ 38 public function getSexAttribute($value): string 39 { 40 return ($value === 0) ? '男性' : '女性'; 41 } 42 43 /** 44 * @param mixed $value 45 * @return string 46 */ 47 public function getAgeAttribute($value): string 48 { 49 return sprintf('%d歳', $value); 50 } 51} 52

php

1// web.php 2Route::get('profiles/{profile}', 'ProfileController@show')->name('profiles.show');

php

1// ExampleController 2 3public function show(Profile $profile) 4{ 5 return view('profiles.show', compact('profile')); 6}

php

1// profiles/show.blade.php 2 3{{ $profile->user_status }}

投稿2020/12/27 02:12

phper.k

総合スコア3923

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/12/28 10:23 編集

いくつか質問があるのですが、getXXXXXAttributeのXには必ずしもカラム名が入るとは限らないと認識でよろしいのでしょうか? また取得する際は、viewで {{ \App\Profile::getUserStatusAttribute() }}と取得していたのですが、なぜ、{{ $profile->user_status }} で取得できるのでしょうか? 具体的にはマニュアルに以下のように記載されていたのですが理解することができませんでした。 > アクセサを定義するには、アクセスしたいカラム名が「studlyケース(Upper Camel Case)」でFooの場合、getFooAttributeメソッドをモデルに作成します。以下の例では、first_name属性のアクセサを定義しています。first_name属性の値にアクセスが起きると、Eloquentは自動的にこのアクセサを呼び出します。
phper.k

2020/12/28 09:02 編集

質問に回答する前に確認のため、あなたに質問があるのですが、よろしいですか?
退会済みユーザー

退会済みユーザー

2020/12/28 10:24

私に質問ですか(?)どうぞ。
phper.k

2020/12/28 10:32 編集

あなたへの質問内容は、追加の質問をする前に、リファレンスを読んだのか? ですが、のちに、編集されてますね。 よんでもよくわからなかったとのことですが、確かに、文章だけではわからないかもしれませんが、その下の部分に、「コードの例」があり、それを見ればわかりませんかね?
退会済みユーザー

退会済みユーザー

2020/12/28 10:44

ありがとうございます。どこが疑問だったか整理し、こちらにコメントしようと思います。
退会済みユーザー

退会済みユーザー

2020/12/30 12:40

整理できました。 まず、getIsMarriageAttributeやgetSexAttributeなどはカラム名に従って命名していることは分かったのですが、getUserStatusAttributeというメソッドはそれに対応したカラムはないのですが、それでも問題ないという認識であっているでしょうか?
退会済みユーザー

退会済みユーザー

2020/12/30 12:46

そちらも以下で取得ができるということですね!ありがとうございます。 $user = App\User::find(1); $fullName = $user->full_name;
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問