1.集合:
Eloquent返回的所有的包含多条记录的结果集都是 'Illuminate\Database\Eloquent\Collection' 对象的实例。例如:通过 get(),all()等方法,返回的结果。
1>Eloquent对象集合继承自Laraval的集合基类,继承了很多处理Eloquent模型底层数组的方法。
all()
get()
...等各种方法
2>集合本身也是迭代器,允许像数组一样对其进行循环。
$users = App\User::where('active', 1)->get();
foreach ($users as $user) { // 像数组一样进行foreach循环
echo $user->name;
}
3>集合使用直观的接口提供了各种映射/简化操作,因此比数组更加强大。例如:
$users = App\User::where('active', 1)->get(); // 集合
$names = $users->reject(function ($user) { // reject只筛选出部分集合中的记录
return $user->active === false;
})->map(function ($user) { // 筛选后的集合元素,只保留name字段
return $user->name;
});
可以看到,支持链式操作、回调函数等,很强大!
4>Eloquent集合,大多数经过方法的处理,返回的是一个新的Eloquent集合,下列几个方法比较特殊,返回的是 '集合基类实例':
pluck()
keys()
zip()
collapse()
flatten()
flip()
5>自定义集合:
Laravel为我们提供了一个 'newCollection()' 方法,来自定义集合
1)针对每个Eloquent模型类,可使用自定义的集合对象
use App\CustomCollection; // 自定义的一个集合对象
class User extends Model{
public function newCollection(array $models = []) // 重写 newCollection() 方法,覆盖Model类的newCollection,这样该模型类就使用了自定义的集合对象
{
return new CustomCollection($models);
}
}
2)对所有的Eloquent模型类,使用自定义的集合对象
直接对Model模型基类,重写 'newCollection()' 方法
2.访问器&修改器:
访问器 - 获取模型属性时,调用方法处理
修改器 - 设置模型属性时,调用方法处理
举例:你可能想要使用Laravel加密器对存储在数据库中的数据进行加密,并且在 Eloquent 模型中访问时自动进行解密。
1>定义访问器:
假设访问Foo字段,就需要定义一个 'getFooAttribute()' 方法。方法名格式是:'get'.属性名.'Attribute'。属性名是数据库字段名的驼峰式写法。例如:first_name ==> getFirstNameAttribute()
示例:
public function getFirstNameAttribute($value)
{
return ucfirst($value); // 获取first_name字段时,对该字段进行 'ucfirst' 转换
}
使用:
App\User::find(1)->first_name; // 获取字段时,自动进行了 'ucfirst()' 转换
2>定义修改器
同访问器类似,方法名是 'set' 开头。例如:setFooAttribute()
示例:
public function setFirstNameAttribute($value)
{
$this->attributes['first_name'] = strtolower($value); // 将处理后的属性值,赋值给$this->attributes['first_name']
}
使用:
$user = App\User::find(1);
$user->first_name = 'Sally'; // 设置时,自动调用了 'strtolower()' 转换
3>日期修改器
默认,Eloquent将 'created_at' 和 'updated_at' 字段值,转换为 'Carbon' 实例,Carbon继承了PHP原生的 'Datetime' 类,提供了各种时间相关的方法
1)定义哪些字段被自动调整为时间,会作为 'Carbon' 实例
protected $dates = ['created_at', 'updated_at', 'disabled_at'];
2)日期存储格式,默认时间戳格式是 'Y-m-d H:i:s',可通过 $dateFormat 属性修改:
protected $dateFormat = 'U';
3)设置日期:
$user = App\User::find(1);
$user->disabled_at = Carbon::now(); // 设置日期为当前的时间戳(这里我们调用的是 'Carbon' 的now()方法,未解除laravel前,一般直接使用now()来获取当前时间戳),保存到数据库中,自动转为 '日期格式了',laravel数据库保存时间应该是 '2016-1-8 10:00:00' timestamp格式
4)获取日期:
$user = App\User::find(1);
return $user->disabled_at->getTimestamp(); // 看到没,直接在 '$user->disabled_at' 上调用 'getTiemstamp()' 方法,因为 '$user->disabled_at' 是 'Carbon类' 的实例
4>属性转换:
模型中的$casts属性为属性字段转换到通用数据类型提供了便利方法。
例如:
protected $casts = [
'is_admin' => 'boolean', // 数据库中存储为 '0|1',访问时,自动转为 'false|true'
];
支持的转换类型:
integer, real, float, double, string, boolean, object,array,collection,date和datetime
5>数组转换:
也是属性转换的一种,特别适合:数组内容的存储。数据库中存储序列化的JSON格式内容,访问时,自动转为array数组格式。
示例:
protected $casts = [
'options' => 'array',
];
类型转换被定义后,访问options属性将会自动从 JSON 反序列化为 PHP 数组,反之,当你设置options属性的值时,给定数组将会自动转化为 JSON 以供存储
3.序列化
构建Json格式的API接口时,经常需要转换 '模型' 和 '关联关系' 为数组或者JSON。
1>转换模型为数组:
$user = App\User::with('roles')->first(); // 一条记录,是模型实例
return $user->toArray();
2>转换集合为数组:
$users = App\User::all(); // 一个集合,也可以转化为数组
return $users->toArray();
3>转换模型为JSON:
$user = App\User::with('roles')->first(); // 一条记录,是模型实例
return $user->toJson();
4>转换集合为JSON:
$users = App\User::all(); // 一个集合,也可以转化为JSON
return $users->toJson();
5>转换模型或集合为字符串时,将会自动调用 'toJson()' 方法:
$user = App\User::find(1);
return (string) $user; // 强制转换为 string 类型,会自动调用 'toJson',生成json格式字符串
6>由于模型和结合在转换为字符串的时候,会转换为JSON,因此,很多api接口,我们可以直接利用这一特性:
Route::get('users', function(){
return App\User::all(); // 返回时,会自动转换为string格式(这里比上面更简单了,都不用使用 '(string)' 强制转换了)
});
7>在JSON中隐藏属性
在模型中定义 $hidden 属性:
protected $hidden = ['password'];
----
注意:
----
如果要隐藏关联关系,使用关联关系的方法名,而不是动态属性名 ----------- 不懂这个什么意思!!!(2者的名字好像是一样的啊)
8>在JSON中显示属性:
在模型中定义 $visible 属性:
protected $visible = ['first_name', 'last_name'];
9>临时暴露隐藏属性:
使用 'makeVisible()' 方法,支持链式操作:
return $user->makeVisible('attribute')->toArray();
10>追加数据库中没有的字段到数组中:
目标:添加一个 'is_admin' 到数组中
步骤:
1)先定义一个访问器:
public function getIsAdminAttribute() // 虚拟字段 'is_admin'
{
return $this->attributes['admin'] == 'yes';
}
2)添加字段名到该模型的 '$appends' 属性:
protected $appends = ['is_admin'];
注意:
appends 数组中的字段还会遵循模型中配置的 visible 和 hidden 设置。
laravel的Eloquent其他笔记
最新推荐文章于 2024-07-04 00:44:00 发布