Laravel 使用模型修改器的 $appends 时,无法使用 faker 生成假数据

版本:laravel 5.7
当使用模型修改器的$appends属性,新增元素时,使用faker生成假数据时,报错误:
Unknown column 'sex_str'

模型修改器:

 $appends = ['sex_str'];

 public function getSexStrAttribute()
 {
     //
 }

屏蔽$appends属性就正常了,怎么解决模型修改器影响生成假数据的问题?

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
leo
最佳答案

@showcj 正常的 seed 操作应该是用 create()$users = factory(\App\Models\User::class)->times(100)->create();,你这里用了 insert 当然要报错

6年前 评论
讨论数量: 7
leo

最近刚好在用 5.7 开发一个新项目,也有用 factory 生成带有 appends 的模型,没有遇到你的情况,应该是你自己的用法不对,贴出你的 seeder 代码

6年前 评论

@leo
当使用模型修改器的$appends属性,新增元素时,使用faker生成假数据时,报错误:
Unknown column 'sex_str'

模型相关代码:

 protected $appends = ['sex_str'];
 public static $sexAttr = ['未知', '男', '女'];

 public function getSexStrAttribute()
 {
     return array_key_exists($this->sex, self::$sexAttr) ? self::$sexAttr[$this->sex] : '';
 }

faker相关代码:

$factory->define(\App\Models\User::class, function (Faker $faker) {
    return [

        'sex' => random_int(1, 2),

        ];
});

屏蔽$appends属性就正常了,怎么解决模型修改器影响生成假数据的问题?

模型修改器的用途是:数据库存的sex是int类型,取出时增加sex_str,转换为字符串。

生成假数据时,faker里加了sex生成的。

6年前 评论
leo

@showcj 『贴出你的 seeder 代码』我说得不够清楚吗?

6年前 评论

@leo
不好意思,没看清楚,
这个是UserTableSeeder.php的

        $user = factory(\App\Models\User::class)->times(100)->make();
        DB::table('users')->insert($user->toArray());

这个是DatabaseSeeder.php的

         $this->call([
             UserTableSeeder::class,
         ]);
6年前 评论
leo

@showcj 正常的 seed 操作应该是用 create()$users = factory(\App\Models\User::class)->times(100)->create();,你这里用了 insert 当然要报错

6年前 评论

@leo
用create会生成100条sql,insert只会生成一条sql,

因为factory里嵌套了一些关联查询,这样生成数据就很慢。
不过还是感谢指出问题所在。:thumbsup:

6年前 评论

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