企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
Laravel 5.5 新增了向中间表模型插入或者更新数据时对类型转换的支持。 目前,在原来的模型中你可以用 $casts 来双向转换。任何继承 Eloquent\Model 类的模型都会查找 $casts 属性,并在读取和写入时将指定的属性转化为数据类型。例如,[文档](https://d.laravel-china.org/docs/5.4/eloquent-mutators#attribute-casting) 里面有个例子: ~~~ 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 … 后面这一步的代码将不再需要