Laravel 5.5 中间表类型转换

file
Laravel 5.5 新增了向中间表模型插入或者更新数据时对类型转换的支持。

目前,在原来的模型中你可以用 $casts 来双向转换。任何继承 Eloquent\Model 类的模型都会查找 $casts 属性,并在读取和写入时将指定的属性转化为数据类型。例如,文档 里面有个例子:

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
    * The attributes that should be cast to native types.
    * @var array
    */
    protected $casts = [
        'is_admin' => 'boolean',
    ];
}

在 Laravel 5.4 中,Taylor 也在自定义中间表模型上添加了定义 $casts 属性的功能,但是只在读取数据时应用了 $casts ,而插入或更新属性时并不会执行转换。

例如,假设你有 Runner 赛跑者模型和 Race 比赛模型。 一个跑步者可以有很多比赛,一场比赛可以有很多赛跑者。 我们把中间表模型称为 RaceRunner,其中包括具有不同数量的单圈时间(取决于比赛的长度,以秒为单位)的 splits 数组,以及所需的 runner_idrace_id

splits 数组在 race_runner 表中以 JSON 格式序列化,因此如果你在 RaceRunner 中间表模型的 $casts 中将 splits 定义为数组,那 dd 出来的结果就会是数组:

dd( $runner->pivot->splits );

// Example:
[
    'Lap 1' => 150,
    'Lap 2' => 163,
    'Lap 3' => 146
]

只是,在创建或更新中间表模型时,你还是要手动转换:

// Cast first...
$splits = $splits->toJson();

// ...then attach:
$runner->races()->attach($raceId, ['splits' => $splits]);

现在,在 Laravel 5.5,Eloquent\ModelEloquent\Relations\Pivot 类的 $casts 属性都会 有一样的行为。 无论你是读取、插入还是更新数据,Laravel 都会「遵循」$casts 属性的设置。 也就是 attachsyncsave 方法也可用于中间表模型。 这个新功能会应用在上面的例子里,即 // Cast first … 后面这一步的代码将不再需要。

关于中间表 Pivot 的用法可以查看 文档, 更多的还有 Leo 大神Laravel 技巧之 Pivot :satisfied:

参考链接:https://laravel-news.com/laravel-5-5-pivot...

本作品采用《CC 协议》,转载必须注明作者和本文链接
Stay Hungry, Stay Foolish.
本帖由 leo 于 7年前 加精
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 7
awesee

赞一个。

7年前 评论
Destiny

琳姐,你知道图片中的字体是啥字体吗?

7年前 评论
Destiny

@JokerLinly 好滴好滴,阿里嘎多!

7年前 评论

有点看不懂 中间表模型 是什么

7年前 评论

@我是谁 在这篇文章中就相当于是 RaceRunner Model

7年前 评论

@JokerLinly 相关的源码在哪里

6年前 评论
goudan 4年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!