Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unable to use Laravel Factory in Tinker

I am unable Model Factory in Laravel Tinker.

//ItemFactory.php

class ItemFactory extends Factory
{
    /**
     * The name of the factory's corresponding model.
     *
     * @var string
     */
    protected $model = Item::class;

    /**
     * Define the model's default state.
     *
     * @return array
     */
    public function definition()
    {
        return [
            'name' => $this->faker->name,
            'slug' => $this->faker->slug(5, true),
            'code' => $this->faker->words(5, true),
            'description' => $this->faker->sentence,
            'price' => $this->faker->randomNumber(1000, 10000),
            'size' => $this->faker->randomElement(['Small', 'Medium', 'Large',]),
        ];
    }
}

Inside Tinker

>>> factory(App\Item::class)->create();

It throws me an error:

PHP Fatal error: Call to undefined function factory() in Psy Shell code on line 1

like image 221
Lizesh Shakya Avatar asked Sep 10 '20 07:09

Lizesh Shakya


People also ask

How do you make a factory in Laravel?

For Laravel 8 With the artisan command, you no longer need to specify the model. By automatically including the factory trait in the model, Laravel automatically makes the factory methods available to the corresponding model. It is then sufficient to call the model in the seeder or in the tests.

Why tinker is used in Laravel?

Laravel Tinker allows you to interact with a database without creating the routes. Laravel tinker is used with a php artisan to create the objects or modify the data. The php artisan is a command-line interface that is available with a Laravel. Tinker is a command tool that works with a php artisan.


4 Answers

After going through the documentation of Model Factory, there were major changes in Laravel 8 version.

For using Model Factory anywhere inside Laravel 8:

  1. Inside Model, we need to import the Illuminate\Database\Eloquent\Factories\HasFactory trait

  2. New command to implement the factory

App\Item::factory()->create();
like image 117
Lizesh Shakya Avatar answered Oct 28 '22 15:10

Lizesh Shakya


In laravel 8 the default route namespace was removed.

Try to change command

factory(App\Item::class)->create();

To

\App\Models\Item::factory()->create(); 
\App\Models\Item::factory(10)->create(); \\If you want to create specify number of record then
like image 41
Bhargav Variya Avatar answered Oct 28 '22 17:10

Bhargav Variya


In Laravel 8.x release notes:

Eloquent model factories have been entirely re-written as class based factories and improved to have first-class relationship support.

Global factory() function is removed as of Laravel 8. Instead, you should now use model factory classes.

  1. Create a factory:
php artisan make:factory ItemFactory --model=Item
  1. Make sure that Illuminate\Database\Eloquent\Factories\HasFactory trait is imported in your model:
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Item extends Model
{
    use HasFactory;

    // ...
}
  1. Use it like this:
$item = Item::factory()->make(); // Create a single App\Models\Item instance

// or

$items = Item::factory()->count(3)->make(); // Create three App\Models\Item instances

Use create method to persist them to the database:

$item = Item::factory()->create(); // Create a single App\Models\Item instance and persist to the database

// or

$items = Item::factory()->count(3)->create(); // Create three App\Models\Item instances and persist to the database

Being said that, if you still want to provide support for the previous generation of model factories within Laravel 8.x, you can use laravel/legacy-factories package.

like image 20
N'Bayramberdiyev Avatar answered Oct 28 '22 15:10

N'Bayramberdiyev


In Laravel 8 I couldn't get the factory method to work just calling it straight out but I was able to get it to work by calling it like a static method on the Item class:

Terminal:

Item::factory()->create();

like image 1
Iulian Rares Coman Avatar answered Oct 28 '22 17:10

Iulian Rares Coman