Laravel 中Eloquent ORM 相關操作

定義

操作

獲取(查詢)

獲取集合,(查詢列表)

返回值是 IlluminateDatabaseEloquentCollection 的一個實例

獲取所有的數據

use?AppUser; $users?=?User::all();

條件獲取列表

$users?=?User::where('active',?1) ?????????????->orderBy('name',?'desc') ?????????????->take(10) ?????????????->get();

獲取數據列值

$result?=?User::where('gender',?'1')->pluck('name'); ?//?返回?['name1','name2?'] //?該自定義鍵必須是該表的其它字段列名,否則會報錯 $result?=?User::where('gender',?'1')->pluck('email','name'); //?返回?{"name1":"ed9@qq.com","name2":"ed89@qq.com"}

獲取單個模型,(查詢單條數據)

//?通過主鍵獲取模型 $user?=?User::find(1); //?獲取匹配查詢條件的第一個模型... $user?=?User::where('active',?1)->first(); //??返回第一個gender為1的用戶的名字 $name?=?User::where('gender',?'1')->value('name'); //?傳遞主鍵數組來調用?find?方法,這將會返回匹配記錄集合: $users?=?AppFlight::find([1,?2,?3]); 如果沒有任何查詢結果,IlluminateDatabaseEloquentModelNotFoundException?異常將會被拋出: $model?=?AppFlight::findOrFail(1); $model?=?AppFlight::where('legs',?'>',?100)->firstOrFail();

處理結果集

$result?=?User::where('gender',?'1')->chunk(5,?function($users)?{ ????????????foreach?($users?as?$user)?{ ????????????????$name?=?$user->name; ????????????????echo?$name; ????????????} })?//?輸出名字 //?result?為?boolean?? $result?=?User::where('gender',?'1')->chunk(5,?function($users)?{ ????????????foreach?($users?as?$user)?{ ??????????????$name?=?$user->name; ??????????????if?($name?==?"dxx5")?{ ?????????????????echo?$name; ?????????????????return?false; ??????????????} ???????????} })?//?找出某個名字

聚合方法

//?獲取總數 $count?=?Flight::where('active',?1)->count(); //?獲取最大值 $max?=?Flight::where('active',?1)->max('price'); //平均值 $max?=?Flight::where('active',?1)->avg('price');

條件查詢

select查詢

??//?查詢名字和email ????$users?=?User::select('name','email?as?user_email')->get(); ????//?返回?[{"name":"name1","user_email":"1@qq.com"}] ????//?查詢構建器實例,添加一個查詢列到已存在的?select?子句 ????$user?=?User::select('name'); ????$users?=?$user->addSelect('gender')->get();

? ? ? ??

聯合

$first?=?DB::table('users') ????????????->whereNull('first_name'); $users?=?DB::table('users') ????????????->whereNull('last_name') ????????????->union($first) ????????????->get();

注:unionAll 方法也是有效的,并且和 union 有同樣的使用方式

Where子句

$users?=?User::where('gender',?'=',?1)->get();?//?男性用戶 $users?=?User::where('gender',?1)->get();?//?同上 $users?=?User::where('age',?'>=',?10)->get();?//?10歲以上用戶 $users?=?User::where('age',?'',?10)->get();?//?非10歲用戶 $users?=?User::where('name',?'like',?'d%')->get();?//?名字為d開頭的用戶 $users?=?User::where('name',?'like',?'%d%')->get();?//?名字含d的用戶 //?傳遞條件數組到?where?函數: $users?=?User::where([['gender',?'=',?'1'],['age',?'>',?'10']])->get();?//10歲以上的男孩 //?or語句 $users?=?User::where('gender',?'=',?1)->orWhere('age',?'>',?'10')->get();

其他where語句

//?whereBetween?方法驗證列值是否在給定值之間: $users?=?User::whereBetween('age',?[1,?7])->get();?//?1-7歲的用戶 //?whereNotBetween?方法驗證列值不在給定值之間: $users?=?User::whereNotBetween('age',?[1,?7])->get();?//?1-7歲以外的用戶 //?whereIn?方法驗證給定列的值是否在給定數組中: $users?=?User::whereIn('id',?[1,?2,?3])->get(); //?whereNotIn?方法驗證給定列的值不在給定數組中: $users?=?User::whereNotIn('id',?[1,?2,?3])->get(); //?whereNull?方法驗證給定列的值為NULL: $users?=?User::whereNull('updated_at')->get(); //?whereNotNull?方法驗證給定列的值不是?NULL: $users?=?User::whereNotNull('updated_at')->get(); //?whereDate?方法用于比較字段值和日期: $users?=?User::whereDate('created_at',?'2018-05-10')->get();?//?20180510注冊的用戶 //?whereMonth?方法用于比較字段值和一年中的指定月份: $users?=?User::whereMonth('created_at',?'10')->get(); //?whereDay?方法用于比較字段值和一月中的制定天: $users?=?User::whereDay('created_at',?'10')->get(); whereYear?方法用于比較字段值和指定年: $users?=?User::whereYear('created_at',?'2016')->get(); //?whereColumn?方法用于驗證兩個字段是否相等,也可以傳遞一個比較運算符到該方法: $users?=?User::whereColumn('first_name',?'last_name')->get(); $users?=?User::whereColumn('updated_at',?'>',?'created_at')->get(); ???????? //?還可以傳遞多條件數組到?whereColumn?方法,這些條件通過?and?操作符進行連接: $users?=?User::whereColumn([ ????????????????['first_name',?'=',?'last_name'], ????????????????['updated_at',?'>',?'created_at'] ????????????])->get();

參數分組

$users?=?User::where('name',?'=',?'xxx') ????????->orWhere(function?($query)?{ ???????????$query->where('age',?'>',?5) ?????????????????->where('gender',?1); ????????}) ????????->get();?//?xxx或大于5歲的男孩 where?exit $users?=?User::whereExists(function?($query)?{ ????????????????$query->select(DB::raw(1)) ??????????????????????->from('articles') ??????????????????????->whereRaw('articles.user_id?=?users.id'); })->get();?//?寫過文章的用戶

? ? ? ? ? ??

排序

$users?=?User::orderBy('age',?'desc')->get();?//?年齡倒序 $user?=?User::latest()->first();?//crate_at??最晚的那個 $user?=?User::oldest()->first();?//crate_at??最早的那個 $users?=?User::inRandomOrder()->first();?//?隨機用戶

限定

$users?=?User::skip(2)->take(3)->get();?//?跳過前2個取中間3個 $users?=?User::offset(2)->limit(3)->get();?//?同上

分組

$users?=?User::groupBy('name')->having('age',?'>',?10)->get();?//?大于10的用戶 //?找到所有售價大于?$2,500?的部分,?沒理解 $users?=?User::select('department',?DB::raw('SUM(price)?as?total_sales')) ????->groupBy('department') ????->havingRaw('SUM(price)?>?2500') ????->get(); when?條件子句 $sortBy?=?null;?//?當sortBy為null,默認name排序 $users?=?User::when($sortBy,? ????????????function?($query)?use?($sortBy)?{ ????????????????return?$query->orderBy($sortBy); ????????????},?function?($query)?{ ????????????????return?$query->orderBy('name'); ????????????}) ????????????->get();

分頁

$users?=?User::paginate(3); $users->appends(['sort'?=>?'name'])->links();?//?修改的是連接 $users->withPath('custom/url'); //?約束條件 $users?=?User::where('id',?'>',?2)->paginate(2); $users?=?User::where('id',?'>',?2)->simplePaginate(2); return?$users->toArray();

返回結果:

當調用 paginate 方法時,你將獲取IlluminatePaginationLengthAwarePaginator 實例,

調用方法simplePaginate 時,將會獲取 IlluminatePaginationPaginator 實例。(不需要知道結果集中數據項的總數)

{ ????"current_page"?:?1 ????"data":?[{"id":1,"name":"name1"},{"id":2,"name":"name2"}] ????"from":1 ????"last_page":2 ????"next_page_url":"http://localhost:8888/user/page?page=2" ????"path":"http://localhost:8888/user/page" ????"per_page":3 ????"prev_page_url":null ????"to":3 ????"total":6 }

每個分頁器實例都可以通過以下方法提供更多分頁信息:

$results->count() $results->currentPage() $results->firstItem() $results->hasMorePages() $results->lastItem() $results->lastPage()?(使用simplePaginate?時無效) $results->nextPageUrl() $results->perPage() $results->previousPageUrl() $results->total()?(使用simplePaginate?時無效) $results->url($page)

插入

插入

$user?=?new?User; $user->name?=?"username"; $user->fill(['grade'?=>?'2']);?//?使用?fill?方法通過數組屬性來填充 $user->save(); $row?=?array('name'?=>?str_random(3),'email'?=>?str_random(3).'@qq.com') $user?=?User::create($row);?//?返回模型對象 $id?=?User::insertGetId($row);?//?插入記錄并返回ID值 $success?=?User::nsert([ ????['email'?=>?'taylor@example.com',?'votes'?=>?0], ????['email'?=>?'dayle@example.com',?'votes'?=>?0] ]);?//?插入多條

更新

單個更新

$user?=?User::find(1); $user->name?=?'new?name'; $user->save();

批量更新

User::where('gender',?1)->update(['age'?=>?1]);

自增自減

$result?=?User::increment('age');?//?返回修改的行數 $result?=?User::increment('age',?2); $result?=?User::decrement('age'); $result?=?User::decrement('age',?2); $result?=?User::increment('age',1,['gender'?=>?1]);?//?年齡自增1?且?性別改為1

其他創建方法

$user?=?User::firstOrCreate(['name'?=>?'Flight?10']);?//?不存在則創建 $user?=?User::firstOrNew(['name'?=>?'Flight?10']);?//?如果不存在初始化一個新的實$user?=?User::updateOrCreate( ????['name'?=>?'username',?'age'?=>?'16'], ????['grade'?=>?3] );?//?將?16歲的username?改成3年級,沒有則創建

刪除

$user?=?User::find(1); $user->delete();?//?通過主鍵查詢后,刪除模型 User::destroy(1);?//?直接通過主鍵刪除 User::destroy([1,?2,?3]); User::destroy(1,?2,?3); $deletedRows?=?User::where('age',?0)->delete();?//查詢?刪除 //?注:通過?Eloquent?批量刪除時,deleting?和?deleted?事件不會被觸發,因為在進行模型刪除時不會獲取模型。

軟刪除

當模型被軟刪除后,它們并沒有真的從數據庫刪除,而是在模型上設置一個 deleted_at 屬性并插入數據庫,如果模型有一個非空 deleted_at 值,那么該模型已經被軟刪除了。

啟用模型的軟刪除功能,可以使用模型上的IlluminateDatabaseEloquentSoftDeletes trait并添加 deleted_at 列到 $dates 屬性:

<?php namespace App; use IlluminateDatabaseEloquentModel; use IlluminateDatabaseEloquentSoftDeletes; class Flight extends Model {     use SoftDeletes;     // 應該被調整為日期的屬性,并添加 deleted_at 列到數據表     protected $dates = [&#39;deleted_at&#39;]; } // laravel Schema 構建器包含一個輔助函數來創建該數據列: Schema::table(&#39;flights&#39;, function ($table) {     $table->softDeletes(); });

現在,當調用模型的 delete 方法時,deleted_at 列將被設置為當前日期和時間.

當查詢一個使用軟刪除的模型時,被軟刪除的模型將會自動從查詢結果中排除。

軟刪除的查詢

判斷給定模型實例是否被軟刪除,可以使用 trashed 方法:

if?($flight-&gt;trashed())?{ ????// } //?如果你想要軟刪除模型出現在查詢結果中,可以使用?withTrashed?方法: $flights?=?AppFlight::withTrashed() ????????????-&gt;where('account_id',?1) ????????????-&gt;get(); ???????????? //?withTrashed?方法也可以用于關聯查詢中: $flight-&gt;history()-&gt;withTrashed()-&gt;get(); //?onlyTrashed?方法只獲取軟刪除模型: $flights?=?AppFlight::onlyTrashed() ????????????-&gt;where('airline_id',?1) ????????????-&gt;get(); ???????????? //?恢復軟刪除模型,使用restore?方法: $flight-&gt;restore(); //?快速恢復多個模型,同樣,這也不會觸發任何模型事件: AppFlight::withTrashed() ????-&gt;where('airline_id',?1) ????-&gt;restore(); ???? //?也可以用于關聯查詢: $flight-&gt;history()-&gt;restore(); //?永久刪除模型,可以使用?forceDelete?方法: $flight-&gt;forceDelete();?//?強制刪除單個模型實例... $flight-&gt;history()-&gt;forceDelete();?//?強制刪除所有關聯模型...

? 版權聲明
THE END
喜歡就支持一下吧
點贊12 分享