Laravel Model
目次
プロパティ
属性
プロパティ | 機能 | 備考 |
---|---|---|
$fillable | 指定したカラムにはcreate、update、fillでの更新が可能 | =ホワイトリスト |
$guarded | 指定したカラムにはcreate、update、fillでの更新が不可 | =ブラックリスト |
$dates | Carbonインスタンスを返す | update_at、cerated_atと同じ |
$casts | first()で取得した際の自動型変換を矯正 |
protected $casts = [
|
$hidden | 通常のfindやgetで取得させない |
$hidden項目を取得する場合
|
$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()の結果を返す場合はメソッドにする
・メソッドではメソッド名に()付けてを呼ぶ必要がある