溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Laravel中Eloquent ORM相關操作示例

發(fā)布時間:2021-01-21 13:14:28 來源:億速云 閱讀:243 作者:小新 欄目:編程語言

這篇文章將為大家詳細講解有關Laravel中Eloquent ORM相關操作示例,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

定義

操作

獲?。ú樵儯?/strong>

獲取集合,(查詢列表)

返回值是 IlluminateDatabaseEloquentCollection 的一個實例

獲取所有的數(shù)據(jù)

use App\User;
$users = User::all();

條件獲取列表

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

獲取數(shù)據(jù)列值

$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"}

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

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

處理結(jié)果集

$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;
              }
           }
}) // 找出某個名字

聚合方法

// 獲取總數(shù)
$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"}]
    // 查詢構(gòu)建器實例,添加一個查詢列到已存在的 select 子句
    $user = User::select('name');
    $users = $user->addSelect('gender')->get();

聯(lián)合

$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的用戶
// 傳遞條件數(shù)組到 where 函數(shù):
$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 方法驗證給定列的值是否在給定數(shù)組中:
$users = User::whereIn('id', [1, 2, 3])->get();
// whereNotIn 方法驗證給定列的值不在給定數(shù)組中:
$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();
        
// 還可以傳遞多條件數(shù)組到 whereColumn 方法,這些條件通過 and 操作符進行連接:
$users = User::whereColumn([
                ['first_name', '=', 'last_name'],
                ['updated_at', '>', 'created_at']
            ])->get();

參數(shù)分組

$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();

返回結(jié)果:

當調(diào)用 paginate 方法時,你將獲取IlluminatePaginationLengthAwarePaginator 實例,

調(diào)用方法simplePaginate 時,將會獲取 IlluminatePaginationPaginator 實例。(不需要知道結(jié)果集中數(shù)據(jù)項的總數(shù))

{
    "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 方法通過數(shù)組屬性來填充
$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'); // 返回修改的行數(shù)
$result = User::increment('age', 2);
$result = User::decrement('age');
$result = User::decrement('age', 2);
$result = User::increment('age',1,['gender' => 1]); // 年齡自增1 且 性別改為1

其他創(chuàng)建方法

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

刪除

$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 事件不會被觸發(fā),因為在進行模型刪除時不會獲取模型。

軟刪除

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

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

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Flight extends Model
{
    use SoftDeletes;
    // 應該被調(diào)整為日期的屬性,并添加 deleted_at 列到數(shù)據(jù)表
    protected $dates = ['deleted_at'];
}
// Laravel Schema 構(gòu)建器包含一個輔助函數(shù)來創(chuàng)建該數(shù)據(jù)列:
Schema::table('flights', function ($table) {
    $table->softDeletes();
});

現(xiàn)在,當調(diào)用模型的 delete 方法時,deleted_at 列將被設置為當前日期和時間.

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

軟刪除的查詢

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

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

關于“Laravel中Eloquent ORM相關操作示例”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI