光看一遍手册,都记不住,做点笔记,加深印象
1.默认的Eloquent模型,存放在app目录下,这点不是特别好,建议在app中,创建一个 “Model”,专门存放模型文件。
手册中提到:可以将它们放在任何可通过composer.json字段加载的地方,但是还不清楚如果配置,暂留!
2.创建模型实例:
php artisan make:model User [-m | --migration] // 使用 -m|--migration选项,创建模型同时,生成 "数据库迁移"
3.模型的几个约定得了解下:
1>模型类对应的数据表
默认使用类的 “蛇形名称”&“复数形式” 对应数据表名称。例如:User类对应的数据表就是:users。UserOrder类应该对应的数据表是:user_orders
可以在模型类中,通过 $table 属性,明确指定对应的数据表
protected $table = 'my_users';
2>主键
Eloquent会假设每个数据表都有一个 "id" 的主键字段。
可以通过 $primaryKey 属性,重新定义主键字段
3>时间戳
默认情况下,Eloquent预计数据表中有 "created_at" & "updated_at" 字段。
不希望Eloquent字段维护这2个字段,可设置:$timestamps = false
public $timestamp = false;
需要自定义时间戳格式,可在模型内设置 $dateFormat 属性(决定了日期如何在数据库中存储,以及当模型被序列化成数组或JSON时的格式)
protected $dateFormat = 'U';
4>数据库连接
默认,所有的Eloquent模型,使用应用程序中默认的数据库连接设置。如果香味模型指定不同的链接,可设置 $connect 属性
protect $connection = 'connection1'; // 此连接名称,可切换链接
4.在控制器中使用:
5.获取模型use APP\User; // 当我们将Eloquent模型放置在app/Model,应该是:use App\Model\User;
1>取回多个模型
1)User::all(); // 返回模型数据表中的所有结果
2)每个Eloquent模型都可以看作是一个 "查询构造器",所以可以使用组装提交语句。
App\User::where()->orderBy()->take()->get(); // 这种结构
3)通过all()、get()等方法,可以取回多条结果的Eloquent方法,都会返回 ”Illmminate\Database\Eloquent\Collection“的实例。可以通过 "Collection" 提供的集合函数来处理结果!
2>取回单个模型
可使用find()、first()方法,来取回单条记录,不是 "Collection" 集合。
3>未找到,抛出异常(并非是未找到记录,就一定会抛出异常。这里的场景是:我们希望未找到结果时,抛出异常)
使用:findOrFail()、firstOrFail(),找不到结果时,会抛出一个 "Illmminate\Database\Eloquent\ModelNotFoundException" 的异常
6.添加和更新模型
1>添加
要在数据库中,创建一条新纪录,只需创建一个新模型实例,并在模型上设置属性&调用save()方法。
$user = new User;
$user->name = 'dongxuemin';
$user->save();
2>更新
1)使用save()方法更新,需要先获取模型,再设置更新的属性&调用save()方法
$user = App\User::find(1);
$user->name = 'yangwei';
$user->save();
2)也可以针对符合指定条件的任意数量模型进行更新。
App\User::where('active', 1)->update(['delayed' => 1]);
7.批量赋值
1>所有的Eloquent模型,都有针对批量赋值(Mass-Assignment)做保护,我们在定义模型时,得指定 $fillable&$guarded 属性中的一个(只能是其中一个)
$fillable - 可批量赋值的属性(白名单)
$guarded - 不可批量赋值的属性(黑名单)
2>一旦设置了属性,就可以通过create()方法,添加一条记录到数据表
$user = App\User::create(['name' => 'name1']); // 这样就插入了一条记录
3>firstOrCreate(['name' => 'name1']),先通过传入的 “字段/值” 组合,查找数据库中的记录,没有则会添加一条记录。
4>firstOrNew(['name' => 'name1']),先通过传入的 “字段/值” 组合,查找数据库中的记录,没有则会 ”返回一个新的模型实例“,得通过 save() 方法,来插入到数据库!
8.删除模型
9.软删除使用delete()方法,也可使用destroy([1, 2, 3])方法(通过主键id来删除)
1>当模型被软删除时,并不会真的从数据库中被移除,而是会在模型上设置一个 ”deleted_at“ 属性,并将其添加到数据库。要在模型上启动软删除,必须在模型上使用 "Illmminate\Database\Eloquent\SoftDeletes" ,并添加 "deleted_at" 字段到 model 的 $dates 属性上。
useIllmminate\Database\Eloquent\SoftDeletes;
protected $dates = ['deleted_at'];
2>数据表中,也必须添加 'deleted_at' 字段
Schema::table('users', function ($table) {
$table->softDeletes();
}
3>当在模型上调用delete()方法,deleted_at字段,将会被设置成目前的时间。
4>确认指定的模型,是否已经被软删除,可调用:trashed() 方法
if ($user->trashed()) { echo '当前模型被软删除'; } // $user为查询的模型数据
10.软删除的相关查找
1>默认查找时,软删除的数据会被排除,不包含软删除的记录
2>希望查找数据,包含软删除数据,使用:
withTrashed()->get() 方法
3>只获取软删除的模型,使用:
onlyTrashed()->get() 方法
11.恢复软删除模型
使用:restore() 方法
12.永久的删除
使用:forceDelete() 方法
13.查找范围
1>全局作用域(Global Scopes)可定义一个有限制的集合,可在程序中反复被调用,就是缩小个查询范围,提前定义了一些频繁的查询。使用方法:在model类中定义一些以 "scope" 为前缀的方法:
public function scopeActive($query) {
return $query->where('active', 1);
14.事件,Eloquent模型会触发许多事件,可以对事件进行监控。可查看手册api!不清楚这里讲的。}
2>利用查找范围:
App\User::active()->orderBy()->get(); // 就可以直接调用了
3>也允许传递参数的方法:
public function scopeOfType($query, $type) {
return $query->where('type', $type);
}