如何在 Laravel 中数据库种子 JSON 字段?

Posted

技术标签:

【中文标题】如何在 Laravel 中数据库种子 JSON 字段?【英文标题】:How to database seed JSON field in Laravel? 【发布时间】:2019-12-04 17:33:48 【问题描述】:

我无法从 JSON 类型的用户表中播种 user_preference 列。当我输入 php artisan db:seed 时,我的 git bash 中出现错误“数组到字符串转换”。

UserSeeder.php

public function run()

    $faker = Faker\Factory::create();
    foreach ($this->getUsers() as $userObject) 
        $user = DB::table('users')->insertGetId([
            "first_name" => $userObject->first_name,
            "last_name" => $userObject->last_name,
            "email" => $userObject->email,
            "email_verified_at" => Carbon::now(),
            "password" => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi',
            "city" => 'Beograd',

            'user_preferences' => [
                $faker->randomElement(["house", "flat", "apartment", "room", "shop", "lot", "garage"])
            ],

            "created_at" => Carbon::now(),
            "updated_at" => Carbon::now(),
            "type" => 'personal',
        ]);

用户表

Schema::table('users', function (Blueprint $table) 
    $table->json('user_preferences')->nullable()->after('city');
);

用户模型

class User extends Authenticatable implements MustVerifyEmail

    use Notifiable;
    use EntrustUserTrait;

    protected $fillable = [
        'first_name', 'last_name', 'email', 'password',
        'city', 'user_preferences', 'active', 'type'
    ];

    protected $hidden = [
        'password', 'remember_token',
    ];

    protected $casts = [
        'email_verified_at' => 'datetime',
        'user_preferences' => 'array',
    ];

【问题讨论】:

你不能把那个数组包装在json_encode中吗? @Jonnix 我太愚蠢了,是的,它有效。 :) 将其发布为答案。 【参考方案1】:

您忘记将其编码为 json。所以你试图插入一个数组。 它尝试将数组序列化为字符串,但不起作用。

'user_preferences' => json_encode([
     $faker->randomElement(
          [
            "house",
            "flat", 
            "apartment", 
            "room", "shop", 
            "lot", "garage"
          ]
       )
  ]),

【讨论】:

【参考方案2】:

在 Laravel 8 中,你可以像这样使用它:

'user_preferences' => [
   $faker->randomElement(
      [
        'house',
        'flat', 
        'apartment', 
        'room', 'shop', 
        'lot', 'garage'
      ]
   )
],

注意:不需要json_encode它。

当然不要忘记把它放在你的模型中。

/**
 * The attributes that should be cast.
 *
 * @var array
 */
protected $casts = [
    'user_preferences' => 'array'
];

【讨论】:

以上是关于如何在 Laravel 中数据库种子 JSON 字段?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 laravel 迁移和种子正确处理数据库数据更改

Laravel 4 db 种子特定播种器文件

Laravel 4:处理种子中的关系

在没有 Laravel 的情况下使用 Laravel 数据库迁移和种子 [关闭]

Laravel 迁移外键取决于种子数据

Laravel Dusk:迁移和种子测试数据库一次