播种表时的数组到字符串转换

时间:2017-04-01 11:58:11

标签: php laravel laravel-5 laravel-5.4 laravel-seeding

尝试播种表时,它会显示一个数组到字符串转换'错误。

这是错误的输出:

[Illuminate\Database\QueryException]
Array to string conversion (SQL: insert into `reviews` (`user_id`, `name`, `location`, `header`, `comments`, `identifier`, `stars`, `privacy`, `actioned`, `appr
oved`, `created_at`) values (10, Bradley Davis, Paulastad, Commodi quas expedita eum., Voluptas magni iusto nemo ea vitae harum quasi., 6c621319-c6ba-41c1-bb0b-696b602470
ef, 5, 1, 0, 1, 2017-03-25 11:44:12))

表格结构:

Schema::create('reviews', function (Blueprint $table) {
    $table->increments('id');
    $table->integer('user_id');
    $table->string('name')->nullable();
    $table->string('location')->nullable();
    $table->string('header')->nullable();
    $table->string('comments')->nullable();
    $table->uuid('identifier');
    $table->integer('stars')->nullable();
    $table->boolean('privacy')->default('1');
    $table->boolean('actioned')->default('0');
    $table->boolean('approved')->default('0');
    $table->nullableTimestamps();
});

种子功能:

for ($i = 1; $i < 41; $i++) {

    $name = User::where('id', $i + 9)->pluck('name')->all();
    $uuid = Uuid::generate(4);

    $review = [
        'user_id' => $i + 9,
        'name' => $name,
        'location' => $faker->city,
        'header' => $faker->sentence($nbWords = 3, $variableNbWords = true),
        'comments' => $faker->text($maxNbChars = 50),
        'identifier' => $uuid,
        'stars' => [1, 2, 3, 4, 5][rand(0, count([1, 2, 3, 4, 5]) - 1)],
        'privacy' => [1, 0][rand(0, count([1, 0]) - 1)],
        'actioned' => [1, 0][rand(0, count([1, 0]) - 1)],
        'approved' => [0, 1][rand(0, count([0, 1]) - 1)],
        'created_at' => Carbon::now()->subWeeks(array_rand([2, 3, 4, 5, 6, 7], 1))
   ];
}

DB::table('reviews')->insert($review);

的print_r($审查):

Array
(
    [user_id] => 10
    [name] => Array
        (
            [0] => David Robertson
        )

    [location] => Lake Suzannechester
    [header] => Repellendus aut alias exercitationem.
    [comments] => Sunt non temporibus pariatur totam aut qui.
    [identifier] => Webpatser\Uuid\Uuid Object
        (
            [bytes:protected] => �a�?�IB��"�mLC�
            [hex:protected] =>
            [string:protected] => d51961bb-3fcf-4942-a0d9-22a56d4c4392
            [urn:protected] =>
            [version:protected] =>
            [variant:protected] =>
            [node:protected] =>
            [time:protected] =>
        )

    [stars] => 4
    [privacy] => 1
    [actioned] => 1
    [approved] => 1
    [created_at] => Carbon\Carbon Object
        (
            [date] => 2017-03-04 12:04:01.225487
            [timezone_type] => 3
            [timezone] => UTC
        )

)

1 个答案:

答案 0 :(得分:1)

如您所见,此处存在多个问题,例如$name不包含名称,但它包含数组,您应该使用:

$name = User::find($i + 9)->name;

代替。

类似于$uuid - 它应该返回字符串而不是某个对象。

当我看这一部分时:

'stars' => [1, 2, 3, 4, 5][rand(0, count([1, 2, 3, 4, 5]) - 1)],
'privacy' => [1, 0][rand(0, count([1, 0]) - 1)],
'actioned' => [1, 0][rand(0, count([1, 0]) - 1)],
'approved' => [0, 1][rand(0, count([0, 1]) - 1)],
'created_at' => Carbon::now()->subWeeks(array_rand([2, 3, 4, 5, 6, 7], 1))

太复杂了。

你可以在这里使用这样的东西:

'stars' => rand(1, 5),
'privacy' => rand(0, 1),
'actioned' => rand(0, 1),
'approved' => rand(0, 1),
'created_at' => Carbon::now()->subWeeks(rand(2, 7))->toDateTimeString(),

此外:

DB::table('reviews')->insert($review);

你在循环之外使用它吗?如果是这样,它没有多大意义,因为在每个循环运行中你再次设置它。但是如果你在循环内部进行,你也可以优化它来不运行那么多的插入(显然对于41个记录它没有太大的区别,但是对于成千上万的它会这样做。)