laravel的Eloquent其他笔记

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 设置。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值