Laravel 5.5 中间表类型转换
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_id
和 race_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\Model
和 Eloquent\Relations\Pivot
类的 $casts
属性都会 有一样的行为。 无论你是读取、插入还是更新数据,Laravel 都会「遵循」$casts 属性的设置。 也就是 attach
、sync
和 save
方法也可用于中间表模型。 这个新功能会应用在上面的例子里,即 // Cast first …
后面这一步的代码将不再需要。
关于中间表 Pivot 的用法可以查看 文档, 更多的还有 Leo 大神 的 Laravel 技巧之 Pivot :satisfied:
本作品采用《CC 协议》,转载必须注明作者和本文链接
赞一个。
琳姐,你知道图片中的字体是啥字体吗?
@Destiny OperatorMono
@JokerLinly 好滴好滴,阿里嘎多!
有点看不懂 中间表模型 是什么
@我是谁 在这篇文章中就相当于是 RaceRunner Model
@JokerLinly 相关的源码在哪里