1.简介
默认创建的Eloquent模型,位于 'app' 目录下,也可以将其放在其它可以被composer.json文件自动加载的地方。
所有Eloquent模型都继承自 'Illuminate\Database\Eloquent\Model'
可以将Eloquent模型,看作是我们之前的数据库 '查询构造器'
2.创建Eloquent模型
生成User模型
php artisan make:model User // 创建一个User模型,默认会生成 'App/User.php'
生成模型类到 'App/Model' 下
php artisan make:model Model/User // 生成到Model子目录下
生成模型时,同时生成数据库迁移,使用 '--migration' 或 '-m'
php artisan make:model User --migration
php artisan make:model User -m
3.Eloquent模型约定:
针对 'flights' 数据表,模型类名为 'Flight':
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Flight extends Model{
//
}
1>表名:
默认,模型的数据表是 '模型名' 的复数作为对应的表名,例如:Flight <=对应=> flights。
可定义 '$table' 属性,来自定义模型对应的表名:
protected $table = 'my_flights';
2>主键:
默认,模型认为每张表的主键名为 'id',可定义 '$primaryKey' 属性来改变
protected $primaryKey = 'user_id';
3>时间戳:
默认,Eloquent期望 'created_at' 和 'updated_at' 在数据表中,不想要Laravel自动管理的这2个字段,设置 '$timestamps' 为 false
public $timestamps = false;
4>自定义时间戳格式:
设置 '$dateFormat' 属性。决定 '日期被如何存储到数据库中' 以及 '日期被如何存储到数据库中'
protected $dateFormat = 'U';
5>数据库连接:
默认情况下,所有的Eloquent模型,使用默认数据库连接(就是 'mysql' 配置段),可设置 '$connection' 来改变:
protected $connection = 'mysql_2';
4.创建完模型及关联的数据表后,开始获取数据(Eloquent模型看作功能强大的查询构建器)
use App\Model\Flight; // 引入Eloquent的 'Flight' 模型类
class FlightController extends Controller{
public function index()
{
/*
$flights 是一个数组,数组中每个元素是一个 'StdClass' 对象
foreach ($flights as $flight) {
echo $flight->name;
}
*/
$flights = Flight::all(); // 使用模型类的 'all()' 方法
return view('flight.index', ['flights' => $flights]);
}
}
1>添加额外约束:
$flights = App\Flight::where('active', 1)
->orderBy('name', 'desc')
->take(10)
->get();
注意:
Eloquent 模型本质上就是查询构建器,你可以在Eloquent查询中使用查询构建器的所有方法。
2>集合
获取多个结果集的方法,返回值是 'Illuminate\Database\Eloquent\Collection' 的一个实例,'Collection'类提供了多个函数来操作结果,我们最常使用的就是 '当作数组' 来循环集合:
foreach ($flights as $flight) {
echo $flight->name;
}
3>使用chunk命令:
Flight::chunk(200, function ($flights) {
foreach ($flights as $flight) {
//
}
});
4>获取单个模型/聚合
find() - 通过主见获取模型
$flight = App\Flight::find(1);
first() - 获取第一条模型
$flight = App\Flight::where('active', 1)->first();
以下2个获取单条记录的方法(同上面2个使用方法一致),查找不到的时候会抛出异常:
findOrFail()
firstOrFail()
如果异常没有被捕获,将会发送 'HTTP 404' 响应,所以,在使用这些方法的时候没有必要对返回404响应编写明确的检查。对于 'api接口' 来请求数据,可以直接这么做:
Route::get('/api/flights/{id}', function ($id) {
return App\Flight::findOrFail($id);
});
5>获取聚合:
count()
sum()
max()
avg()
6>基本插入:
想要在数据库中插入新的记录,只需创建一个新的模型实例,设置模型的属性,然后调用save方法:
$flight = new Flight; // 1.创建模型实例
$flight->name = $request->name; // 2.设置name字段
$flight->save(); // 保存数据,将数据插入到数据库
注意:
created_at 和 updated_at 字段,在save()调用时,被自动设置,不用手动设置!
7>基本更新:
1)对于更新一个模型,首先获取它,再设置想要的更新,然后调用save方法。同样,updated_at时间戳会被自动更新:
$flight = App\Flight::find(1);
$flight->name = 'New Flight Name';
$flight->save();
2)更新查询出来的多个模型实例:
App\Flight::where('active', 1)
->where('destination', 'San Diego')
->update(['delayed' => 1]);
8>批量赋值:
使用create()方法,创建一个新的模型。该方法返回被插入的模型实例。但是,在此之前,你需要指定模型的fillable或guarded属性,因为所有Eloquent模型都通过批量赋值(Mass Assignment)进行保护。
$fillable - 可赋值的属性(白名单)
$guarded - 不可复制的属性(黑名单)
firstOrCreate() - 先去数据库查找,未找到则创建一个新的记录
firstOrNew() - 先去数据库查找,未找到则创建一个模型(返回的模型实例,并未持久化到数据库中,需要调用save()手动持久化)
9>删除模型:
delete() - 查询出来的记录删除
destroy() - 通过主键删除
App\Flight::destroy(1);
App\Flight::destroy([1, 2, 3]);
App\Flight::destroy(1, 2, 3);
10>软删除
软删除后,并未真正删除,在模型上设置一个 'deleted_at' 字段(就是我们平常的isshow = 0,添加一个状态位)
1)启用软删除
1.使用 'Illuminate\Database\Eloquent\SoftDeletes',并添加 'deleted_at' 到 $dates 属性
use Illuminate\Database\Eloquent\Model;
class Flight extends Model{
use SoftDeletes;
protected $dates = ['deleted_at'];
}
2.数据表中,创建 'deleted_at' 字段。Laravel Schema构建器包含一个帮助函数来创建该列:
Schema::table('flights', function ($table) {
$table->softDeletes();
});
3.当调用模型的delete方法时,deleted_at列将被设置为当前日期和时间,并且,当查询一个使用软删除的模型时,被软删除的模型将会自动从查询结果中排除。
2)判断给定模型实例是否被软删除
trashed()
if($flight->trashed()){ }
3)查询数据,包含被软删除的模型:
withTrashed()
$flights = App\Flight::withTrashed()->where('account_id', 1)->get();
4)只获取软删除模型
onlyTrashed()
$flights = App\Flight::onlyTrashed()->where('airline_id', 1)->get();
5)恢复软删除模型
restore()
App\Flight::withTrashed()->where('airline_id', 1)->restore(); // 快速恢复多个模型
6)永久删除模型
forceDelete()
$flight->forceDelete();
11>查询作用域
1)全局作用域
按某个 '字段' 来划分,该字段,可能会存在于多张表中,而且多张表中该字段的定义相同!
软删除的 'deleted_at' 就是这种。设置一个字段的全局作用域,会作用于所有包含该字段的数据表。
复杂,看文档
2)本地作用域
就是在模型类中定义了一些常用的方法,可加入到查询构建器的链式操作中:
注意:
在模型类中,定义的方法前加上 'scope' 前缀,就表示 '本地作用域' 了。
示例:
class User extends Model{
public function scopePopular($query) // 定义了 '活跃用户' 的查询作用域
{
return $query->where('votes', '>', 100);
}
public function scopeActive($query)
{
return $query->where('active', 1);
}
}
使用本地查询作用域:
注意:
使用时,不需要加 'scope' 前缀
示例:
$users = App\User::popular()->active()->orderBy('created_at')->get();
3)动态作用域
针对的也是 '本地作用域',不过,可以接收参数:
示例:
class User extends Model{
public function scopeOfType($query, $type) // 添加了 'type' 参数
{
return $query->where('type', $type);
}
}
使用 '动态作用域'
$users = App\User::ofType('admin')->get(); // 调用时,传递参数
12>事件:
Eloquent模型可以触发事件,允许你在模型生命周期中的多个时间点调用如下这些方法:
creating, created, updating, updated, saving, saved,deleting, deleted, restoring, restored。
基本使用:
一个新模型被首次保存的时候,creating和created事件会被触发。如果一个模型已经在数据库中存在并调用save方法,updating/updated事件会被触发,无论是创建还是更新,saving/saved事件都会被调用。
在 'AppServerProvider' 服务提供者中,定义Eloquent事件监听器
示例:
use App\Model\User;
class AppServiceProvider extends ServiceProvider{
public function boot()
{
User::creating(function ($user) { // 定义User模型的 'creating' 监听器
if ( ! $user->isValid()) {
return false;
}
});
}
}
laravel的Eloquent起步
最新推荐文章于 2022-05-11 17:56:16 发布