Laravel的Eloquent 模型的介紹

來源:互聯網
上載者:User
這篇文章主要介紹了關於Laravel的Eloquent 模型的介紹,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

Eloquent 模型

預設繼承use Illuminate\Database\Eloquent\Model類。

資料表名稱與模型名稱約定:

資料庫的表名一般使用“蛇形命名法”命名。蛇形命名法要求單詞小寫,單詞之間用_底線串連,且名稱是複數。

與之對應的模型名稱,則使用“帕斯卡法“命名,即單詞頭一字母都大寫。

如果不是按以上約定,則需指明對應的資料表:

class Flight extends Model{    /**     * 與模型關聯的資料表     *     * @var string     */    protected $table = 'myflights';}

主鍵:

模型預設資料表用id欄位作主鍵,並且是遞增整數類型。這些可以自訂:

class Flight extends Model{    /**     * 與模型關聯的資料表     */    protected $table = 'my_flights';    protected $primaryKey='mid';  //自訂主鍵欄位        protected $keyType = 'string';  //自訂主鍵類型為字串        public $incrementing = false;    //主鍵非自增型}

時間截:

模型預設存在created_at 和 updated_at兩欄位,可設定$timestamps不需兩欄位:

class Flight extends Model{    /**     * 該模型是否被自動維護時間戳記     */    public $timestamps = false;}

$dateFormat屬性可自訂時間截格式儲存在資料表的格式:

class Flight extends Model{    /**     * 模型的日期欄位的儲存格式     */    protected $dateFormat = 'U';}

自訂時間截欄位名:

<?phpclass Flight extends Model{    const CREATED_AT = 'creation_date';    const UPDATED_AT = 'last_update';}

自訂資料庫連接:

class Flight extends Model{    /**     * 此模型的串連名稱。     */    protected $connection = 'connection-name';}

模型查詢:

use App\Flight;$flights = App\Flight::all();   //查詢所有資料foreach ($flights as $flight) {    echo $flight->name;}$flights = App\Flight::where('active', 1)               ->orderBy('name', 'desc')               ->take(10)               ->get();             //有條件地查詢資料

all和get方法返回 Illuminate\Database\Eloquent\Collection執行個體。

如果查詢大批量資料,可使用chunk,可節省記憶體:

Flight::chunk(200, function ($flights) {    foreach ($flights as $flight) {        //    }});

或使用遊標方法cursor大幅度減少記憶體的使用:

foreach (Flight::where('foo', 'bar')->cursor() as $flight) {    //}

查詢單條資料:

// 通過主鍵取回一個模型...$flight = App\Flight::find(1);// 取回符合查詢限制的第一個模型 ...$flight = App\Flight::where('active', 1)->first();//如果找不到模型則拋出異常//Illuminate\Database\Eloquent\ModelNotFoundException//自動返回 HTTP 404 響應給使用者$model = App\Flight::where('legs', '>', 100)->firstOrFail();

彙總查詢:

$count = App\Flight::where('active', 1)->count();$max = App\Flight::where('active', 1)->max('price');

資料更新:

save方法:需要先檢索一次,再設定要更新的屬性再執行save方法,同時updated_at也會自動更新。

update方法:設定where條件,將更新欄位以索引值對傳入update方法。該更新不會觸發saved和updated模型事件。

$flight = App\Flight::find(1);$flight->name = 'New Flight Name';$flight->save(); //查詢一次後再更新App\Flight::where('active', 1)          ->where('destination', 'San Diego')          ->update(['delayed' => 1]); //設定條件後再批次更新

插入資料:

使用模型建立資料,需先設定$fillable或$guarded屬性。兩屬性只能二選一。

class Flight extends Model{    /**     * 可以被批量賦值的屬性。     * @var array     */    protected $fillable = ['name'];}class Flight extends Model{    /**     * 不可被批量賦值的屬性。可定義為空白數組,表示所有屬性都可以賦值。     * @var array     */    protected $guarded = ['price'];}

插入資料的方法:

$flight = App\Flight::create(['name' => 'Flight 10']); //添加新記錄並返回已儲存的模型執行個體$flight->fill(['name' => 'Flight 22']); //已有執行個體模型可使用fill方法
// 通過 name 屬性檢索航班,當結果不存在時建立它...$flight = App\Flight::firstOrCreate(['name' => 'Flight 10']);// 通過 name 屬性檢索航班,當結果不存在的時候用 name 屬性和 delayed 屬性去建立它$flight = App\Flight::firstOrCreate(    ['name' => 'Flight 10'], ['delayed' => 1]);// 通過 name 屬性檢索航班,當結果不存在時執行個體化...$flight = App\Flight::firstOrNew(['name' => 'Flight 10']);// 通過 name 屬性檢索航班,當結果不存在的時候用 name 屬性和 delayed 屬性執行個體化$flight = App\Flight::firstOrNew(    ['name' => 'Flight 10'], ['delayed' => 1]);// 如果有從奧克蘭飛往聖地亞哥的航班,將價格設為 99 美元// 如果不存在匹配的模型就建立一個$flight = App\Flight::updateOrCreate(    ['departure' => 'Oakland', 'destination' => 'San Diego'],    ['price' => 99]);

firstOrCreate:如果查不到該資料,則根據第一參數和第二參數記錄建立記錄返回儲存的模型;

firstOrNew:如果查不到該資料,則根據第一參數和第二參數記錄建立新模型,但並未儲存資料,需要手動save才可以儲存資料;

updateOrCreate:根據第一參數作條件用更新第二參數資料,如果資料不存在則合并兩參數建立記錄返回儲存的模型。

刪除模型:

$flight = App\Flight::find(1);$flight->delete();  //通過查詢所得的模型執行個體進行delete方法刪除//通過主鍵刪除一至多條資料:App\Flight::destroy(1);App\Flight::destroy([1, 2, 3]);App\Flight::destroy(1, 2, 3);//通過查詢條件大量刪除,並返回刪除條數$deletedRows = App\Flight::where('active', 0)->delete();

大量刪除時,deleted和deleting模型事件不會被觸發。

虛刪除:

資料表應設定deleted_at欄位。模型內引用SoftDeletes trait,並設定deleted_at欄位到$dates屬性上。

<?phpnamespace App;use Illuminate\Database\Eloquent\Model;use Illuminate\Database\Eloquent\SoftDeletes;class Flight extends Model{    use SoftDeletes;    /**     * 需要被轉換成日期的屬性。     * @var array     */    protected $dates = ['deleted_at']; }

設定了虛刪除的模型,在delete方法會設定deleted_at為當前日期和時間。查詢虛刪除的模型會自動排除被虛刪除的模型。

if ($flight->trashed()) {    //檢查該模型執行個體是否被虛刪除}$flights = App\Flight::withTrashed()  //能使用查詢包含虛刪除的資料                ->where('account_id', 1)                ->get();$flights = App\Flight::onlyTrashed()  //只查詢虛刪除的資料                ->where('airline_id', 1)                ->get();$flight->restore();  //恢複被虛刪除的模型App\Flight::withTrashed()   //大量復原模型,不會觸發任何模型事件        ->where('airline_id', 1)        ->restore();

虛刪除模型使用強制移除:

$flight->forceDelete();

查詢範圍:

給模型添加查詢約束。分全域和本地兩種:

全域--每個查詢都自動加條件約束;

本地--根據需要調用本地約束。

全域範圍:

首先需實現scope介面類.

<?phpnamespace App\Scopes;use Illuminate\Database\Eloquent\Scope;use Illuminate\Database\Eloquent\Model;use Illuminate\Database\Eloquent\Builder;class AgeScope implements Scope{    /**     * 將範圍應用於給定的 Eloquent 查詢產生器     *     * @param  \Illuminate\Database\Eloquent\Builder  $builder     * @param  \Illuminate\Database\Eloquent\Model  $model     * @return void     */    public function apply(Builder $builder, Model $model)    {        return $builder->where('age', '>', 200);    }}

如果全域範圍要將欄位添加到查詢的 select 語句中,則應該使用 addSelect 方法而不是 select,以免替換查詢的現有select。

應用全域範圍:

在模型的boot方法使用addGlobalScope方法。

<?phpnamespace App;use App\Scopes\AgeScope;use Illuminate\Database\Eloquent\Model;class User extends Model{    /**     * 模型的「啟動」方法     *     * @return void     */    protected static function boot()    {        parent::boot();        static::addGlobalScope(new AgeScope);    }}

也可以使用閉包定義全域範圍,不必單獨定義一個類:

class User extends Model{    /**     * 模型的「啟動」方法     *     * @return void     */    protected static function boot()    {        parent::boot();                static::addGlobalScope('age', function(Builder $builder) {                    $builder->where('age', '>', 200);        });    }}

刪除全域範圍:

User::withoutGlobalScope(AgeScope::class)->get();  //刪除指定的範圍// 刪除所有的全域範圍User::withoutGlobalScopes()->get();// 刪除一些全域範圍User::withoutGlobalScopes([    FirstScope::class, SecondScope::class])->get();

本地範圍:

定義通用的約束在需要時使用。定義方法:在模型內定義scope首碼的方法。

<?phpnamespace App;use Illuminate\Database\Eloquent\Model;class User extends Model{    /**     * 限制查詢只包括受歡迎的使用者。     *     * @return \Illuminate\Database\Eloquent\Builder     */    public function scopePopular($query)    {        return $query->where('votes', '>', 100);    }    /**     * 限制查詢只包括活躍的使用者。     *     * @return \Illuminate\Database\Eloquent\Builder     */    public function scopeActive($query)    {        return $query->where('active', 1);    }}

使用方法:

$users = App\User::popular()->active()->orderBy('created_at')->get();

動態範圍:

class User extends Model{    /**     * 限制查詢只包括指定類型的使用者。     *     * @return \Illuminate\Database\Eloquent\Builder     */    public function scopeOfType($query, $type)    {        return $query->where('type', $type);    }}//調用範圍時傳參$users = App\User::ofType('admin')->get();

模型事件:

retrieved --查詢觸發

creatingcreated--建立觸發

updatingupdated--更新觸發

savingsaved--建立、更新觸發

deletingdeleted--刪除觸發

restoringrestored--恢複觸發

事件指派相應的監控器:

<?phpnamespace App;use App\Events\UserSaved;use App\Events\UserDeleted;use Illuminate\Notifications\Notifiable;use Illuminate\Foundation\Auth\User as Authenticatable;class User extends Authenticatable{    use Notifiable;    /**     * 模型的事件映射。     *     * @var array     */    protected $dispatchesEvents = [        'saved' => UserSaved::class,   //觸發saved事件,調用UserSaved監控器        'deleted' => UserDeleted::class, //觸發deleted事件,調用UserDeleted監控器    ];}

也可所有監聽放在一個觀察器類中:

<?phpnamespace App\Observers;use App\User;class UserObserver{    /**     * 監聽使用者建立的事件。     *     * @param  User  $user     * @return void     */    public function created(User $user)    {        //    }    /**     * 監聽使用者刪除事件。     *     * @param  User  $user     * @return void     */    public function deleting(User $user)    {        //    }}

註冊觀察器:

<?phpnamespace App\Providers;use App\User;use App\Observers\UserObserver;use Illuminate\Support\ServiceProvider;class AppServiceProvider extends ServiceProvider{    /**     * 運行所有應用.     *     * @return void     */    public function boot()    {        User::observe(UserObserver::class);    }}

以上就是本文的全部內容,希望對大家的學習有所協助,更多相關內容請關注topic.alibabacloud.com!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.