zoukankan      html  css  js  c++  java
  • Laravel 5.1 文档攻略 —— Eloquent: 读取器和修饰器

    简介

    这一章其实很简单,Model的属性不是和数据表的字段一一对应吗?

    那么在存储和呈现数据的时候,我们有时会需要预先对数据一些处理。比如为了保密,我们可以利用Laravel encrypter在数据库里存加密的数据,别人拿去也没用,我们可以把一段解密程序放在model里,只有通过model里的解密程序才能把数据解密并呈现出来;

    除了可以改模型的属性值,Eloquent还可以改属性(字段)的数据类型。

    读取器和修饰器(Accessors & Mutators)

    一看到这两个字,马上高大尚了,Accessors & Mutators 也就是 Getter 和 Setter, 是数据存储前后的一些预处理方法。这一般是Java,C#这些”高级”的语言说法,Taylor把它用在屌丝PHP这里了,然而并无违和感。

    读取器

    1. namespace App;
    2. use IlluminateDatabaseEloquentModel;
    3. class User extends Model
    4. {
    5. public function getFirstNameAttribute($value)
    6. {
    7. return ucfirst($value);
    8. }
    9. }

    既然是get,就是在从数据库读数据的时候对数据进行修改;

    注意getFirstNameAttribute这个写法,这是个魔术方法,FirstName是你的字段名,需要用驼峰命名法;

    方法内你就可以对字段值(属性值)进行处理;

    例子是把首字母转化为大写了。

    1. $user = AppUser::find(1);
    2. $firstName = $user->first_name;

    回头你在使用属性的时候,发现first_name的值首字母自动变成大写了。

    修饰器

    1. namespace App;
    2. use IlluminateDatabaseEloquentModel;
    3. class User extends Model
    4. {
    5. public function setFirstNameAttribute($value)
    6. {
    7. $this->attributes['first_name'] = strtolower($value);
    8. }
    9. }

    既然是set方法,那么肯定是写入数据之前对数据进行处理;

    上面这个例子是把名字全变成小写字母存入数据库(包括对象的属性也会自动转换为小写)。

    日期修饰器(Mutators)

    Eloquent的模型会自动将日期类型字段进行修饰处理,例如默认的created_atupdated_at字段,在模型里,它们会自动转换成为Carbon类的对象,Carbon类里有很多用来处理时间方法。

    1. namespace App;
    2. use IlluminateDatabaseEloquentModel;
    3. class User extends Model
    4. {
    5. protected $dates = ['created_at', 'updated_at', 'deleted_at'];
    6. }

    这里就指定了那些字段是属于日期类型的字段。

    在模型中指定为日期类型的字段后,你可以使用 UNIX 时间戳, date string (Y-m-d)格式,date-time string和Carbon类对象等方式给该字段赋值:

    1. $user = AppUser::find(1);
    2. $user->deleted_at = Carbon::now();
    3. $user->save();

    下面说一个比较特殊的点:

    1. $user = AppUser::find(1);
    2. return $user->created_at->getTimestamp();

    假设你打印$user,你会发现它大概是这样的:

    1. AppModelsUser {#1270
    2. id: 8,
    3. name: "woody",
    4. email: "72727921@qq.com",
    5. active: 1,
    6. created_at: "2015-08-05 07:27:09",
    7. updated_at: "2015-09-16 01:34:36",
    8. }

    但是如果你打印$user->created_at, 你会发现它被自动转哈为Carbon对象:

    1. CarbonCarbon {#1267
    2. +"date": "2015-08-05 07:27:09.000000",
    3. +"timezone_type": 3,
    4. +"timezone": "UTC",
    5. }

    所以后面可以接Carbon的各种方法。但是,如果你在blade视图中直接使用{{$user->created_at}}, 出来将是字符串类型。

    默认的日期存储格式是Y-m-d H:i:s, 你可以改model的$dateFormat属性来改变格式:

    1. namespace App;
    2. use IlluminateDatabaseEloquentModel;
    3. class Flight extends Model
    4. {
    5. protected $dateFormat = 'U';
    6. }

    注意,这个格式不仅将影响日期在数据库中的存储格式,还将影响模型在转换成为数组或json时,日期字段的保存格式。

    属性数值类型转换

    从数据读出来的值,有时候你不仅希望改变它的值,还想改变它的数值类型。当然,你可以用accessor实现这一点,但laravel 提供了更直接的方法$cast。解释一下cast的语义,cast不是改变,而是暂时转换。
    假设is_admin是以0,1整数的形式在数据库中存储的,

    1. <?php
    2. namespace App;
    3. use IlluminateDatabaseEloquentModel;
    4. class User extends Model
    5. {
    6. protected $casts = [
    7. 'is_admin' => 'boolean',
    8. ];
    9. }

    那么,这样设置过后读出来将是布尔值;

    数组类型转换

    有一个应用场景很常见,就是有些字段我们是以json序列化格式存入数据的,比如一组图片,一批选项值;
    这个时候我们用这些值的时候要反序列化,每次都要处理很麻烦,这里我们可以用:

    1. <?php
    2. namespace App;
    3. use IlluminateDatabaseEloquentModel;
    4. class User extends Model
    5. {
    6. protected $casts = [
    7. 'options' => 'array',
    8. ];
    9. }

    这样,对于options这个字段,每次读出来的就是一个数组了,方便在PHP里使用。

    1. $user = AppUser::find(1);
    2. $options = $user->options;
    3. $options['key'] = 'value';
    4. $user->options = $options;
    5. $user->save();

    看到没有,取出来当数组使用,存回去的时候数组存回去,存到数据库里面自动序列化变string。

     

     
     
  • 相关阅读:
    What is a Complex Element
    XSD(Schema)教程 [转]
    XML对WEB开发的意义
    System.Xml名称空间下的支持DOM的类型
    C#:XML操作类
    xsl:valueof select="." 什么意思?
    文档对象模型
    XSLT转换XML
    DTCMS添加栏目教程
    win8 Windows Media Player 启动后CPU占用率高(60%左右)的解决办法
  • 原文地址:https://www.cnblogs.com/isykw/p/6151811.html
Copyright © 2011-2022 走看看