laravel的Eloquent其他笔记

来源:互联网 发布:宁波最新房价走势知乎 编辑:程序博客网 时间:2024/05/16 14:00
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和datetime5>数组转换:也是属性转换的一种,特别适合:数组内容的存储。数据库中存储序列化的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(); // 一个集合,也可以转化为JSONreturn $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 设置。

0 0
原创粉丝点击