Laravel5.6 Eloquent ORM使用笔记整理

使用说明:

继承:Illuminate\Database\Eloquent\Model
创建模型实例:php artisan make:model User
创建模型实例并生成migration文件:
php artisan make:model User -m
php artisan make:model User --migration
默认约定:小写的模型类名复数格式作为与其对应的表名

Model类属性说明:

protected $table = 'my_flights';//指定表名
protected $primaryKey = 'uid';//指定主键名默认为id
protected $incrementing = false;//非自增主键时默认自增
protected $keyType = 'string';//主键不是整型时
protected $timestamps = false;//不自动维护created_at和updated_at时间戳字段
const CREATED_AT = 'creation_date';//自定义用于存储时间戳的字段名称
const UPDATED_AT = 'last_update';//自定义用于存储时间戳的字段名称
protected $connection = 'connection-name';//使用指定的数据库连接
protected $fillable = ['name'];//定义哪些属性是可以进行赋值
protected $guarded = ['price'];//定义哪些属性是不能进行赋值

Model类方法使用:

在对应的PHP文件中use需要的Model的命名空间(如:use App\Flight;

获取全部数据(all 和 get)

$flights = App\Flight::all();

获取指定条件数据

$flights = App\Flight::where('active', 1)
               ->orderBy('name', 'desc')
               ->take(10)
               ->get();

以上返回值均为对象,参考以下使用方式

foreach ($flights as $flight) {
    echo $flight->name;
}

分块处理结果集减少内存消耗

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

获取单个数据(find 和 first)

$flight = App\Flight::find(1);//通过主键获取单条数据
$flight = App\Flight::where('active', 1)->first();//通过指定条件获取单条数据
$flights = App\Flight::find([1, 2, 3]);//主键获取方式支持多个

$model = App\Flight::findOrFail(1);//无数据时抛出异常
$model = App\Flight::where('legs', '>', 100)->firstOrFail();//无数据时抛出异常

count、sum、max使用:

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

创建和更新数据:

$flight = new Flight;
$flight->name = $request->name;
$flight->save();//创建

$flight = App\Flight::find(1);
$flight->name = 'New Flight Name';
$flight->save();//更新

批量更新:

App\Flight::where('active', 1)
      ->where('destination', 'San Diego')
      ->update(['delayed' => 1]);

快速创建:

$flight = App\Flight::create(['name' => 'Flight 10']);
$flight = new Flight;
$flight->fill(['name' => 'Flight 22']);

其他情况(firstOrCreate,firstOrNew,updateOrCreate):

$flight = App\Flight::firstOrCreate(['name' => 'Flight 10']);//不存在则创建
$flight = App\Flight::firstOrCreate(
    ['name' => 'Flight 10'], ['delayed' => 1]
);//通过name获取航班如果不存在则通过name和delayed属性创建

$flight = App\Flight::firstOrNew(['name' => 'Flight 10']);//通过属性获取航班不存在初始化一个新的实例
$flight = App\Flight::firstOrNew(
    ['name' => 'Flight 10'], ['delayed' => 1]
);//通过name获取航班如果不存在则通过name和delayed属性创建
$flight->save();//firstOrNew需要手动保存

$flight = App\Flight::updateOrCreate(
    ['departure' => 'Oakland', 'destination' => 'San Diego'],
    ['price' => 99]
);//如果有从奥克兰到圣地亚哥的航班则将价格设置为$99没有匹配的模型则创建

删除:

$flight = App\Flight::find(1);
$flight->delete();//通过主键删除
App\Flight::destroy(1);//快速通过主键删除
App\Flight::destroy([1, 2, 3]);//快速通过主键删除
App\Flight::destroy(1, 2, 3);//快速通过主键删除

$deletedRows = App\Flight::where('active', 0)->delete();//按条件批量删除

软删除:

protected $dates = ['deleted_at'];//定义Model属性
Schema::table('flights', function ($table) {
    $table->softDeletes();
});//快速添加deleted_at列到flights数据表
if ($flight->trashed()) {
    //
}//是否被软删除
$flights = App\Flight::withTrashed()
            ->where('account_id', 1)
            ->get();//软删除模型将会自动从查询结果中排除,此方式可将软删除数据出现在查询结果中
$flight->history()->withTrashed()->get();//withTrashed方法也可以用于关联查询中
$flights = App\Flight::onlyTrashed()
            ->where('airline_id', 1)
            ->get();//onlyTrashed方法只获取软删除数据
$flight->restore();//恢复一个被软删除的数据
App\Flight::withTrashed()
    ->where('airline_id', 1)
    ->restore();//批量恢复
$flight->history()->restore();//批量恢复
#### 永久删除:
$flight->forceDelete();//单个永久删除
$flight->history()->forceDelete();//批量永久删除

查询作用域:

全局作用域(给定模型的所有查询添加条件约束)
http://laravelacademy.org/post/8855.html
使用匿名的全局作用域可避免创建Scope类
使用本地作用域(Model里面定义常用的查询条件供调用时复用)
动态作用域(将作用域参数在调用时动态传入)

$users = App\User::ofType('admin')->get();

回调事件:

Eloquent 模型可以触发事件,允许你在模型生命周期中的多个时间点调用如下这些方法:retrieved, creating, created, updating, updated, saving, saved, deleting, deleted, restoring, restored。事件允许你在一个指定模型类每次保存或更新的时候执行代码。

标签: 无

发表评论: