【整理】Laravel 中Eloquent ORM 相關操做

Laravel 中Eloquent ORM 相關操做

定義

操做

獲取(查詢)

獲取集合,(查詢列表)

返回值是 IlluminateDatabaseEloquentCollection 的一個實例

獲取全部的數據php

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

條件獲取列表html

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

獲取數據列值laravel

$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 = App\Flight::find([1, 2, 3]);
若是沒有任何查詢結果,IlluminateDatabaseEloquentModelNotFoundException 異常將會被拋出:
$model = App\Flight::findOrFail(1);
$model = App\Flight::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();

聯合json

$first = DB::table('users')
            ->whereNull('first_name');

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

注:unionAll 方法也是有效的,而且和 union 有一樣的使用方式數組

Where子句app

$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語句dom

// 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 exitpost

$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 Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class Flight extends Model
{
    use SoftDeletes;
    // 應該被調整爲日期的屬性,並添加 deleted_at 列到數據表
    protected $dates = ['deleted_at'];
}

// Laravel Schema 構建器包含一個輔助函數來建立該數據列:
Schema::table('flights', function ($table) {
    $table->softDeletes();
});

如今,當調用模型的 delete 方法時,deleted_at 列將被設置爲當前日期和時間.
當查詢一個使用軟刪除的模型時,被軟刪除的模型將會自動從查詢結果中排除。

軟刪除的查詢

判斷給定模型實例是否被軟刪除,可使用 trashed 方法:
if ($flight->trashed()) {
    //
}

// 若是你想要軟刪除模型出如今查詢結果中,可使用 withTrashed 方法:
$flights = App\Flight::withTrashed()
            ->where('account_id', 1)
            ->get();
            
// withTrashed 方法也能夠用於關聯查詢中:
$flight->history()->withTrashed()->get();

// onlyTrashed 方法只獲取軟刪除模型:
$flights = App\Flight::onlyTrashed()
            ->where('airline_id', 1)
            ->get();
            
// 恢復軟刪除模型,使用restore 方法:
$flight->restore();

// 快速恢復多個模型,一樣,這也不會觸發任何模型事件:
App\Flight::withTrashed()
    ->where('airline_id', 1)
    ->restore();
    
// 也能夠用於關聯查詢:
$flight->history()->restore();

// 永久刪除模型,可使用 forceDelete 方法:

$flight->forceDelete(); // 強制刪除單個模型實例...
$flight->history()->forceDelete(); // 強制刪除全部關聯模型...

關於查詢做用域,模型事件,查看移步官網文檔

相關文章
相關標籤/搜索