Eloquent 模型,功能强大的查询构建器
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Flight extends Model
{
//自定义用于存储时间戳的字段名称
const CREATED_AT = 'creation_date';
const UPDATED_AT = 'last_update';
public $primaryKey = 'x_id'; //覆盖默认主键 id
protected $table = 'my_flights'; //关联到模型的数据表
public $timestamps = false; //不打时间戳, 不更新created_at 和 updated_at
protected $dateFormat = 'U'; //模型日期列的存储格式
protected $connection = 'connection-name';
protected $fillable = ['name']; // 可以被批量赋值的属性.
protected $guarded = ['price']; // 不能被批量赋值的属性
protected $dates = ['deleted_at']; //应该被调整为日期的属性
}
获取单个模型/聚合结果
App\Flight::find(1);
App\Flight::where('active', 1)->first();
App\Flight::find([1, 2, 3]);
Not Found 异常
$model = App\Flight::findOrFail(1);
$model = App\Flight::where('legs', '>', 100)->firstOrFail();
聚合结果
$count = App\Flight::where('active', 1)->count();
$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]);
create
firstOrCreate/firstOrNew
// 通过属性获取航班, 如果不存在则创建... $flight = App\Flight::firstOrCreate(['name' => 'Flight 10']); // 通过name获取航班,如果不存在则通过name和delayed属性创建... $flight = App\Flight::firstOrCreate( ['name' => 'Flight 10'], ['delayed' => 1] );
// 通过属性获取航班, 如果不存在初始化一个新的实例…
$flight = App\Flight::firstOrNew(['name' => 'Flight 10']);
// 通过name获取,如果不存在则通过name和delayed属性创建新实例…
$flight = App\Flight::firstOrNew( ['name' => 'Flight 10'], ['delayed' => 1] );
updateOrCreate
// 如果有从奥克兰到圣地亚哥的航班则将价格设置为 $99 // 如果没有匹配的模型则创建之 $flight = App\Flight::updateOrCreate( ['departure' => 'Oakland', 'destination' => 'San Diego'], ['price' => 99] );
删除模型
$flight = App\Flight::find(1); $flight->delete();
通过主键删除模型
App\Flight::destroy(1); App\Flight::destroy([1, 2, 3]); App\Flight::destroy(1, 2, 3);
通过查询删除模型
App\Flight::where('active', 0)->delete();
软删除
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes;
判断给定模型实例是否被软删除,可以使用 trashed 方法:
if ($flight->trashed()) {
//
}
包含软删除模型
App\Flight::withTrashed()
->where('account_id', 1)
->get();
只获取软删除模型
App\Flight::onlyTrashed()
->where('airline_id', 1)
->get();
恢复软删除模型
$flight->restore();
使用 restore 方法来快速恢复多个模型
App\Flight::withTrashed()
->where('airline_id', 1)
->restore();
永久删除模型
// 强制删除单个模型实例... $flight->forceDelete(); // 强制删除所有关联模型... $flight->history()->forceDelete();
查询作用域
Scope 接口
匿名的全局作用域
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;
class User extends Model{
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();
本地作用域
Model类写 scope 开头的方法
public function scopePopular($query)
{
return $query->where('votes', '>', 100);
}
使用本地作用域
App\User::popular()->active()->orderBy('created_at')->get();
动态作用域,可以接受参数
public function scopeOfType($query, $type){
return $query->where('type', $type);
}
事件
Eloquent 模型可以触发事件,允许你在模型生命周期中的多个时间点调用如下这些方法:retrieved, creating, created, updating, updated, saving, saved, deleting, deleted, restoring, restored。
protected $dispatchesEvents = [
'saved' => UserSaved::class,
'deleted' => UserDeleted::class,
];
定义观察者 App\Observers
注册观察者: App\Providers\AppServiceProvider ;
访问器 & 修改器
定义访问器
public function getFirstNameAttribute($value)
{
return ucfirst($value);
}
定义修改器
setFirstNameAttribute
属性转换
常用属性:integer, real, float, double, string, boolean, object,array,collection,date,datetime 和 timestamp
protected $casts = [
‘is_admin’ => ‘boolean’,
];
日期修改器
protected $dates = [ ‘created_at’, ‘updated_at’, ‘disabled_at’];
日期格式化
protected $dateFormat = ‘U’;