Home > Mobile >  Illuminate\Database\Grammar::parameterize(): Argument #1 ($values) must be of type array, string g
Illuminate\Database\Grammar::parameterize(): Argument #1 ($values) must be of type array, string g

Time:09-08

I am trying to Seed a database using a Model Factory in Laravel but am seeing this error on the terminal.

$ php artisan tinker

Psy Shell v0.11.8 (PHP 8.1.0 — cli) by Justin Hileman
>>> Parking::factory(1)->create();
[!] Aliasing 'Parking' to 'App\Models\Parking' for this Tinker session.
TypeError: Illuminate\Database\Grammar::parameterize(): Argument #1 ($values) must be of type array, string given, called in C:\wamp64\www\my-valet\vendor\laravel\framework\src\Illuminate\Database\Query\Grammars\Grammar.php on line 1010

From the multiple solutions I have tried, it seems the issue is at the faker-generated content level, but I need that faker content for the factory to work as intended.

Below are the Factory and Migration classes that will help you when trying to find the solution.

Here is my factory class

class ParkingFactory extends Factory
{
    protected $model = Parking::class;

    /**
     * Define the model's default state.
     *
     * @return array
     */
    public function definition(): array
    {
        return [
            'name' => $this->faker->words(2),
            'description' => $this->faker->sentence,
            'spaces' => rand(10, 100),
            'physical_location' => $this->faker->streetAddress,
            'latlng' => $this->faker->localCoordinates,

            'base_pay' => $this->faker->numberBetween(100, 200),
            'base_pay_breakdown' => $this->faker->sentence,
            'rate_per_minute' => $this->faker->numberBetween(2, 10),
            'overnight_base_pay' => $this->faker->numberBetween(100, 200),
            'overnight_base_pay_breakdown' => $this->faker->sentence,
            'overnight_rate_per_minute' => $this->faker->numberBetween(2, 10),
            'other_charges_base_pay' => $this->faker->numberBetween(100, 200),
            'other_charges_base_pay_breakdown' => $this->faker->sentence,
            'other_charges_rate_per_minute' => $this->faker->numberBetween(2, 10),

            'has_disability_accessibility' => $this->faker->boolean,
            'has_other_charges' => $this->faker->boolean(1),
            'has_overnight_parking' => $this->faker->boolean,
            'overnight_charge_type' => $this->faker->randomElement(['none', 'flat', 'minute', 'both']),

//            'owner_id' => User::factory()->create(),

            'created_at' => now(),
            'updated_at' => now()
        ];
    }
}

Here is the migration for the Parking table

Schema::create('parkings', function (Blueprint $table) {
            $table->id();

            $table->string('name');
            $table->mediumText('description');
            $table->string('code')
                ->nullable();
            $table->integer('spaces');
            $table->string('physical_location')
                ->nullable();
            $table->string('latlng')->nullable();


            //charges info
            $table->decimal('base_pay')
                ->default(0.00);
            $table->string('base_pay_breakdown')
                ->nullable();
            $table->decimal('rate_per_minute')
                ->default(0.00);
            $table->decimal('overnight_base_pay')
                ->default(0.00);
            $table->string('overnight_base_pay_breakdown')
                ->nullable();
            $table->decimal('overnight_rate_per_minute')
                ->default(0.00);
            $table->decimal('other_charges_base_pay')
                ->default(0.00);
            $table->string('other_charges_base_pay_breakdown')
                ->nullable();
            $table->decimal('other_charges_rate_per_minute')
                ->default(0.00);
            //charges info end


            $table->boolean('has_disability_accessibility')
                ->default(false);
            $table->boolean('has_other_charges')
                ->default(false);
            $table->boolean('has_overnight_parking')
                ->default(true);
            $table->string('overnight_charge_type')
                ->default('none'); //flat | minute | both
            $table->string('status')
                ->default('active');


            $table->foreignId( 'owner_id')
                ->nullable()
                ->constrained('users')
                ->nullOnDelete();


            $table->timestamps();
            $table->softDeletes();
        });

It is worth noting am using Laravel v9.24.0, PHP v8.1.0, and MySQL v8.0.27.

What might be the cause of my error?

CodePudding user response:

The name field of your table is defined as a string, however, the words method of faker returns an array.

Supplying the words method with true as a second argument will return two words as a string.

'name' => $this->faker->words(2, true);

CodePudding user response:

$this->faker->words(2)

Generates 2 words in an array, which isn't accepted as valid param when you're trying to insert it into the db.

[
    "omnis",
    "sequi",
]

Either serialize it using implode function, or do it any other way.

  • Related