Laravel Model 知識點

sunlight_w發表於2019-10-23

保護屬性

fillable

<?php
namespace App;

use Illuminate\Database\Eloquent\Model;

class Flight extends Model
{
    /**
     * 可以被批量賦值的屬性。
     *
     * @var array
     */
    protected $fillable = ['name'];
}

白名單,在變數 $fillable 中的欄位可以批量賦值

隱藏屬性

hidden

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Flight extends Model
{
    /**
     * 可以被批量賦值的屬性。
     *
     * @var array
     */
    protected $hidden = ['name'];
}

當我們需要對使用者密碼或其它敏感資訊在使用者例項通過陣列或 JSON 顯示時進行隱藏,則可使用 hidden 屬性

通俗的來講就是

資料庫查詢成功後,返回資料時,會自動過濾 $hidden 中的欄位,以免暴露敏感資訊

日期轉換器

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * 應該轉換為日期格式的屬性.
     *
     * @var array
     */
    protected $dates = [
        'seen_at',
    ];
}

上面的例子就是設定欄位 seen_at 屬性為日期

$user->seen_at 返回的就是一個時間日期物件(Carbon物件)

ORM

附加(多對多關聯)

$user = App\User::find(1);

1.$user->roles()->attach($roleId);
2.$user->roles()->attach($roleId,  ['expires'  =>  $expires]);
3.$user->roles()->attach([
    1 => ['expires' => $expires],
    2 => ['expires' => $expires],
]);
  1. 例如,我們假設一個使用者可以擁有多個角色,並且每個角色都可以被多個使用者共享。給某個使用者附加一個角色是通過向中間表插入一條記錄實現的,可以使用 attach 方法完成該操作
    2.在將關係附加到模型時,還可以傳遞一組要插入到中間表中的附加資料
  2. attach 允許傳遞一個陣列

分離(多對多關聯)

// 移除使用者的一個角色...
$user->roles()->detach($roleId);

// 移除使用者的所有角色...
$user->roles()->detach();

//deteach 允許傳遞一個陣列
$user->roles()->detach([1,  2,  3]);

本地作用域

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * 只查詢受歡迎的使用者的作用域
     *
     * @param  \Illuminate\Database\Eloquent\Builder  $query
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function scopePopular($query)
    {
        return $query->where('votes', '>', 100);
    }

    /**
     * 只查詢 active 使用者的作用域
     *
     * @param  \Illuminate\Database\Eloquent\Builder  $query
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function scopeActive($query)
    {
        return $query->where('active', 1);
    }
}

使用本地作用域

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * 只查詢受歡迎的使用者的作用域
     *
     * @param  \Illuminate\Database\Eloquent\Builder  $query
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function scopePopular($query)
    {
        return $query->where('votes', '>', 100);
    }

    /**
     * 只查詢 active 使用者的作用域
     *
     * @param  \Illuminate\Database\Eloquent\Builder  $query
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function scopeActive($query)
    {
        return $query->where('active', 1);
    }
}

本地作用域允許定義通用的約束集合以便在應用程式中重複使用。例如,你可能經常需要獲取所有「流行」的使用者。要定義這樣一個範圍,只需要在對應的 Eloquent 模型方法前新增 scope 字首。
作用域總是返回查詢構建器