Laravel Model

プロパティ

属性
プロパティ 機能 備考
$fillable 指定したカラムにはcreate、update、fillでの更新が可能 =ホワイトリスト
$guarded 指定したカラムにはcreate、update、fillでの更新が不可 =ブラックリスト
$dates Carbonインスタンスを返す update_at、cerated_atと同じ
$casts first()で取得した際の自動型変換を矯正 protected $casts = [
 'id' => 'int',
]
$hidden 通常のfindやgetで取得させない $hidden項目を取得する場合
User::first(1)->makeVisible(['created_at'])
$table 物理テーブル名を指定 リレーションを変更する場合」参照
$incrementing idのincrementを停止 public $incrementing = false;

 

アクセサ

※Testモデルクラス
class Test extends Model
{
 public function getXXXAttribute()
 {
  return $this->カラム名 . 'laravel';
 }
}

ミューテタ

※Testモデルクラス
class Test extends Model
{
 public function setXXXAttribute($value)
 {
  return $this->attributes['カラム名'] = $value;
 }
}

scope

※Testモデルクラス
class Test extends Model
{
 public function scopeXXX($query, $param)
 {
  return $query->where('カラム', $param);
 }
}

呼び出し
Test::XXX(5);

モデルクラスと物理テーブルのリレーション

命名規則

テーブルは複数形、モデルクラスは単数形
この名前のモデルクラスとテーブルが自動的に関連付けされる

リレーションを変更する場合

/**
* @var string
*/

protected $table = '物理テーブル名';

リレーションとユーザー定義関数

リレーション
public function recentPost(){ 〜 }

呼び出し時
$this->recentPost;

ユーザー定義関数
public function recentPost(){ 〜 }

呼び出し時
$this->recentPost();

条件追加

{
 public function phone(): HasOne
 {
  return $this->hasOne(Phone::class)
   ->where(〜);
 }
}

リレーション

一覧

ユーザー(User)、電話(Phone)のモデル定義例

種別 関係 機能
hasOne 1対1 ユーザは1つだけプロフィールを持つ
hasMany 1対多 ユーザは複数の記事を持つ
belongsTo 多対1 記事は1つのユーザーに属している
belongsMany 多対多 タグは複数の記事に属している
HasOne

phones
id user_id number

users
id name

class User extends Model
{
 public function phone(): HasOne
 {
  return $this->hasOne(Phone::class);
  ※Phoneモデルuser_id、Userモデルidを結合する場合

  return $this->hasOne(Phone::class, foreignKey);
  ※PhoneモデルforeignKey、Userモデルidを結合する場合

  return $this->hasOne(Phone::class, foreignKey, localKey);
  ※PhoneモデルforeignKey、UserモデルlocalKeyを結合する場合
 }
}

※コントローラ等で
$phone = User::find(1)->phone;

BelongsTo

users
id name

phones
id user_id number

class Phone extends Model
{
 public function user(): BelongsTo
 {
  return $this->belongsTo(User::class);
  ※Phoneモデルuser_id、Userモデルidを結合する場合
 }
}

※コントローラ等で
$phone = Phone::find(1)->user;

HasMany

class User extends Model
{
 public function post(): HasMany
 {
  return $this->hasMany(Post::class);
  ※Postモデルuser_id、Userモデルidを結合する場合
 }
}

BelongsToMany

class Post extends Model
{
 public function user(): BelongsTo
 {
  return $this->belongsTo(User::class);
  ※Postモデルuser_id、Userモデルidを結合する場合
 }
}

 
 
リレーションエラー

・hasMany等のリレーション設定をしていて、対象レコードが複数あるのに単一レコードの値を取得しようとしている
 does not exit
・リレーションではモデルインスタンスを返さなくてはいけない
・リレーションではリレーションメソッド名をそのまま呼ぶ必要がある
・モデルを返さず値やget()の結果を返す場合はメソッドにする
・メソッドではメソッド名に()付けてを呼ぶ必要がある

Laravel

前の記事

Laravel View
Laravel

次の記事

Laravel Migration/Seed