首页 > 代码库 > Laravel 5.1 文档攻略 —— Eloquent:模型对象序列化

Laravel 5.1 文档攻略 —— Eloquent:模型对象序列化

在写api的时候,数据一般是以json格式进行传输的,没有对象可以直接使用。这个时候,对数据的序列化转换就很重要,Eloquent提供了很方便的方法和约定,不仅可以转换,还可以控制里面的键值。

基本用法

将模型转化为数组

  1. $user = App\User::with(‘roles‘)->first();
  2. return $user->toArray();

把一个模型转化成数组;

  1. $users = App\User::all();
  2. return $users->toArray();

把collection转化为数组;

将模型转化为Json

  1. $user = App\User::find(1);
  2. return $user->toJson();

这个是手动函数;

如果你直接返回一个模型或collection,那么系统会自动把它cast成json:

  1. Route::get(‘users‘, function () {
  2. return App\User::all();
  3. });

这个你可以用路由测试一下结果;

隐藏Json中的一些属性

像password这种字段,其实是不希望在json中出现给别人看到的,那么可以把它隐藏

  1. namespace App;
  2. use Illuminate\Database\Eloquent\Model;
  3. class User extends Model
  4. {
  5. protected $hidden = [‘password‘];
  6. }

这样写是黑名单;

  1. namespace App;
  2. use Illuminate\Database\Eloquent\Model;
  3. class User extends Model
  4. {
  5. protected $visible = [‘first_name‘, ‘last_name‘];
  6. }

这样写是白名单;

文档用红字写到:

  1. Note: When hiding relationships, use the relationship‘s method name, not its dynamic property name.

意思是说,由于有些表是关联查询出来的,你可以隐藏这些表,但是填上面过滤字段的时候,不要填关联表里的字段,而是填模型表间关系的方法,这样就可以把整个表隐藏掉,如果你要隐藏关联表里的部分字段,那么到关联表里去隐藏。(本来想写个例子,老婆叫我去吃早饭了,就先不写了。)

增加Json中的一些属性

刚才说了去掉属性,显然有时候你也需要手动增加一些属性:

第一步,增加一个Accessor:

  1. namespace App;
  2. use Illuminate\Database\Eloquent\Model;
  3. class User extends Model
  4. {
  5. public function getIsAdminAttribute()
  6. {
  7. //return $this->attributes[‘admin‘] == ‘yes‘;
  8. //官网是这样写的,何必增加理解难度,让人混淆呢,真是的;
  9. //我简写成这样了
  10. return ‘yes‘;
  11. }
  12. }

第二步,把增加的字段添加到$appends这个数组里:

  1. namespace App;
  2. use Illuminate\Database\Eloquent\Model;
  3. class User extends Model
  4. {
  5. public function getIsAdminAttribute()
  6. {
  7. //return $this->attributes[‘admin‘] == ‘yes‘;
  8. //官网是这样写的,何必增加理解难度,让人混淆呢,真是的;
  9. //我简写成这样了
  10. return ‘yes‘;
  11. }
  12. protected $appends = [‘is_admin‘];
  13. }

好,json里就多了一个is_admin: "yes"

Laravel 5.1 文档攻略 —— Eloquent:模型对象序列化