user860511
user860511

Reputation:

Array to string conversion when seeding a table

When trying to seed a table, it's showing an 'array to string conversion' error.

This is the output of the error:

[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))

Table structure:

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();
});

Seed function:

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($review):

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
        )

)

Upvotes: 1

Views: 1542

Answers (1)

Marcin Nabiałek
Marcin Nabiałek

Reputation: 111829

As you see there are multiple problems here, for example $name doesn't hold name, but it holds the array, you should use:

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

instead.

Similar is for $uuid - it should return string instead of some object.

Also when I look at this part:

'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))

it's far too complicated.

You could use here something like this:

'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(),

Also:

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

do you use it outside of loop? If so, it does not make much sense, as in each loop run you set it again. However if you do it inside loop, you could also optimized this to not run so many inserts (obviously for 41 records it won't make much difference but for thousands it would do).

Upvotes: 2

Related Questions