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

发布于 2022-09-11 15:20:27 字数 723 浏览 24 评论 0

版本:laravel 5.7

当使用模型修改器的$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生成的。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

东风软 2022-09-18 15:20:27

@iBrand
找到原因了,seeder里写法问题:

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

我用的insert,应该用create

但是用create会生成1000条sql,insert只会生成一条sql,
因为factory里嵌套了一些关联查询,这样生成数据就很慢。

先改成create了,不知道还有没有其它方法?

夏末的微笑 2022-09-18 15:20:27

append 数组中通常都是数据库中不存在的字段,不存在的字段你去 faker 生成模拟数据肯定报错 Unknown column sex_str

-----------------我是分割线-----------------

经过用 Laravel5.7 试验,并不会出现题主说的问题,题主还是仔细检查下自己的代码,哪有有代码去设置了 sex_str, 导致保存数据库时去存储这个字段,所以提示 Unknown column 'sex_str'。

class User extends Authenticatable
{
    use Notifiable;

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

    protected $appends = ['sex_str'];

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    public function getSexStrAttribute()
    {
        return array_key_exists($this->sex, self::$sexAttr) ? self::$sexAttr[$this->sex] : '';
    }
}
$factory->define(App\User::class, function (Faker $faker) {
    return [
        'name' => $faker->name,
        'email' => $faker->unique()->safeEmail,
        'sex' => random_int(1, 2),
        'email_verified_at' => now(),
        'password' => '$2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm', // secret
        'remember_token' => str_random(10),
    ];
});
factory(App\User::class, 50)->create();

clipboard.png

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文