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;
 }
}

ローカルスコープ

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

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

グローバルスコープ

addGlobalScope

use Illuminate\Database\Eloquent\Builder;

class User extends Model
{
 protected static function booted()
 {
  static::addGlobalScope(‘status’, function (Builder $builder) {
   $builder->where(‘status’, 1);
  });
 }
}

利用方法
通常の取得処理のみで自動的に実行される
$users = User::get();

↓の様にwhereメソッド利用は不要
$users = User::where(‘status’, 1)->get();

グローバルスコープを利用しない場合
$users = User::withoutGlobalScope(‘status’)->get();

Scopeクラス利用

use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Scope;

class UserScope extends Scope
{
 public function apply(Builder $builder, Model $model)
 {
  $builder->where(‘status’, 1);
 }
}

use App\Scopes\UserIdScope;

class User extends Model
{
 protected static function booted()
 {
  static::addGlobalScope(new UserIdScope);
 }
}

利用方法
通常の取得処理のみで自動的に実行される
$users = User::get();

グローバルスコープを利用しない場合
$users = User::withoutGlobalScope(UserScope::class)->get();

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

命名規則

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

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

/**
* @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