laravel笔记-Eloquent ORM(杂项)

27 篇文章 0 订阅
17 篇文章 0 订阅

laravel笔记-Eloquent ORM(杂项)

写在前面

时间可贵,善用目录↑

学习Laravel的笔记,仅仅是作为laravel文档笔记,目的是强化对文档的理解,质量不高。


什么是杂项

集合、访问器、修改器、序列化


集合

Eloquent 返回的所有的包含多条记录的结果集都是 Illuminate\Database\Eloquent\Collection 对象的实例

就是说Eloquent查询返回的是Collection这个类的实例,它本身支持一些方法,方便我们对查询结果进行操作。

具体方法详见 laravel笔记-集合


访问器&修改器

访问器和修改器允许你在获取模型属性或设置其值时格式化 Eloquent 属性。

访问器

在Eloquent使用getFooAttribute方法创建访问器,Foo表示要访问的字段(驼峰命名)。
本例创建一个sex的访问器。在访问sex字段时访问器会被调用:

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model{
    /**
     * 设置用户的性别
     *
     * @param  string  $value
     * @return string
     */
    public function getSexAttribute($value)
    {
        //当访问sex字段时会调用访问器
        return $value == 1 ? '男':'女';
    }
}

正如你所看到的,该字段的原生值被传递给访问器,然后返回处理过的值。

修改器

相应的修改器,需要在模型中定义setFooAttribute方法。


namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model{
    /**
     * 设置用户的性别
     *
     * @param  string  $value
     * @return string
     */
    public function setSexAttribute($value)
    {
        $this->attributes['sex'] = $value == 男 ? 1:0;
    }
}

日期修改器

默认情况下,Eloquent 将会转化created_at和updated_at列的值为 Carbon 实例,该类继承自 PHP 原生的Datetime类。

当然,我们可以根据自己的需求将需要的字段转化为Carbon。
使用$dates属性。

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model{
    /**
     * 应该被调整为日期的属性
     *
     * @var array
     */
    protected $dates = ['created_at', 'updated_at', 'disabled_at'];
}

这样disabled_at字段也可以使用一些Carbon的方法:

$user = App\User::find(1);
$user->disabled_at->getTimestamp();

同时如果字段为日期格式,我们也可以通过Carbon来进行方便的取值:

$user = App\User::find(1);
$user->disabled_at = Carbon::now();
$user->save();

如上例,laravel会自动将正确的格式存入数据库。

属性转换

比如说,一个字段在数据库中为了方便保存的是integer类型,但是我们在实际操作的时候需要它是boolean类型。那么就需要属性转换这个操作。
通过$casts实现

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model{
    /**
     * 应该被转化为原生类型的属性
     *
     * @var array
     */
    protected $casts = [
        'is_admin' => 'boolean',
    ];
}

这样当我们再访问is_admin的时候获得的就是boolean型的数据了。

数组&JSON转换

这里比较重要的就是JSON和数之间的相互转换。

比如说你表中的一个字段储存的是JSON数据,而在进行逻辑操作的时候需要数组。

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model{
    /**
     * 应该被转化为原生类型的属性
     *
     * @var array
     */
    protected $casts = [
        'options' => 'array',
    ];
}

就是这样。

$user = App\User::find(1);
$options = $user->options;
$options['key'] = 'value';
$user->options = $options;
$user->save();

序列化

前面说过,我们通过Eloquent在数据库中取出的数据是Collection的实例,但是有时候我们需要将这个实例转化为数组或者JSON数据。

这就需要进行序列化操作。
Eloquent提供了方便的序列化操作方法,会自动将Eloquent实例包括关联关系自动转化为响应类型。

$user = App\User::with('roles')->first();
//序列化为数组
$userArray = $user->toArray();
//序列化为JSON
$userJSON = $user->toJson();

隐藏属性

有些时候我们在序列化的时候希望隐藏一些属性,比如密码。
这时就需要$hidden属性。

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model{
    /**
     * 在数组中隐藏的属性
     *
     * @var array
     */
    protected $hidden = ['password'];
}

当然,有的时候需要暴露一下被隐藏的属性,比如说验证密码。

return $user->makeVisible('attribute')->toArray();

也可以临时隐藏一些属性:

return $user->makeHidden('attribute')->toArray();

追加属性

当然,有时候我们需要追加一些数据库中没有的属性到Eloquent。
可以使用$appends属性和getFooAttribute方法来共同实现。

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model{
    /**
     * 追加到模型数组表单的访问器
     *
     * @var array
     */
    protected $appends = ['is_admin'];
    /**
     * 为用户获取管理员标识
     *
     * @return bool
     */
    public function getIsAdminAttribute()
    {
        return $this->attributes['admin'] == 'yes';
    }
}

这样就完成了is_admin属性的追加。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值