Reputation: 197
I have the error stated above, and here is the copy log
php artisan db:seed
BadMethodCallException
Call to undefined method App\Models\Category::factory()
at vendor/laravel/framework/src/Illuminate/Support/Traits/ForwardsCalls.php:50
46▕ * @throws \BadMethodCallException
47▕ */
48▕ protected static function throwBadMethodCallException($method)
49▕ {
➜ 50▕ throw new BadMethodCallException(sprintf(
51▕ 'Call to undefined method %s::%s()', static::class, $method
52▕ ));
53▕ }
54▕ }
• Bad Method Call: Did you mean App\Models\Category::toArray() ?
+3 vendor frames
4 database/seeders/DatabaseSeeder.php:38
Illuminate\Database\Eloquent\Model::__callStatic()
+22 vendor frames
27 artisan:37
Illuminate\Foundation\Console\Kernel::handle()
Here is the databaseseeder.php class since the error is there:
<?php
namespace Database\Seeders;
use App\Models\Category;
use App\Models\Product;
use App\Models\Transaction;
use App\Models\User;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*
* @return void
*/
public function run()
{
// \App\Models\User::factory(10)->create();
DB::statement('SET FOREIGN_KEY_CHECKS=0');
User::truncate();
Category::truncate();
Product::truncate();
Transaction::truncate();
DB::table('category_product')->truncate();
$cantidadUsuarios = 200;
$cantidadCategories = 30;
$cantidadProductos = 1000;
$cantidadTransacciones = 1000;
\App\Models\User::factory()->count($cantidadUsuarios)->create();
\App\Models\Category::factory()->count($cantidadUsuarios)->create();
\App\Models\Product::factory()->count($cantidadTransacciones)->create()->each (
function ($producto) {
$categorias = Category::all()->random(mt_rand(1, 5))->pluck('id');
$producto->categories()->attach($categorias);
}
);
\App\Models\Transaction::factory()->count($cantidadTransacciones)->create();
}
}
There is the error line:
\App\Models\Category::factory()->count($cantidadUsuarios)->create();
Here we got the category class:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Category extends Model
{
public $table = "categories";
protected $fillable = [
'name',
'description',
];
}
Here we got the category factory:
<?php
namespace Database\Factories;
use App\Models\Category;
use Illuminate\Database\Eloquent\Factories\Factory;
class CategoryFactory extends Factory
{
/**
* The name of the factory's corresponding model.
*
* @var string
*/
protected $model = Category::class;
/**
* Define the model's default state.
*
* @return array
*/
public function definition()
{
return [
//
'name' => $this->faker->word,
'description' => $this->faker->paragraph(1),
];
}
}
Here is the category migration:
<?php
use App\Models\Product;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateCategoriesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('categories', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('description', 1000);
$table->integer('quantity')->unsigned();
$table->string('status')->default(Product::PRODUCTO_NO_DISPONIBLE);
$table->string('image');
$table->integer('seller_id')->unsigned();
$table->timestamps();
$table->foreign('seller_id')->references('id')->on('users');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('categories');
}
}
I am posting all you need since I am new to this and I cannot find the problem.
Upvotes: 23
Views: 77358
Reputation: 15786
As of Laravel 8, you need to use the factory trait for the model to have the factory()
method available.
class Category extends Model
{
use HasFactory;
...
}
Upvotes: 52
Reputation: 449
add Trait to model => HasFactory
use Illuminate\Database\Eloquent\Factories\HasFactory;
class Model extends Model
{
use HasFactory;
}
Upvotes: 6
Reputation: 11
If at all you are using tinker, after adding Use HasFactory class, then simply end your current session and start another one.
- Ctr+c
- Php artisan tinker
Upvotes: 0
Reputation: 573
if your using Laravel 8 Illuminate\Database\Eloquent\Factories\HasFactory is not there anymore, so just wrap your model class in factory() method instead
factory(App\Models\Category::class)->count($cantidadUsuarios)->create();
or
factory(App\Category::class)->count($cantidadUsuarios)->create();
Upvotes: 2
Reputation: 716
Follow this code:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Category extends Model
{
use HasFactory;
}
Upvotes: 14