How to generate "make:model -a" with directory for seeders and controller and migrate name?

1.7k Views Asked by At

How to generate "make:model -a" with directory for seeders and controller and migrate name?

Laravel Framework 8.44.0

I am generating a model php artisan make:model Blog/MyCategory -a and expect to see the following structure:

Controllers/Blog/MyCategoryController.php
Models/Blog/MyCategory.php
factories/Blog/MyCategory.php
mifrations/2021_06_01_042639_create_blog_my_categories_table.php
seeders/Blog/MyCategorySeeder.php

Execute the command php artisan make:model Blog/Category -a

Model created successfully.
Factory created successfully.
Created Migration: 2021_06_01_044253_create_my_categories_table
Seeder created successfully.
Controller created successfully.

but it creates

Controllers/MyCategoryController.php (NO)
Models/Blog/MyCategory.php (YES)
factories/Blog/MyCategory.php (YES)
mifrations/2021_06_01_042639_create_my_categories_table.php (NO)
seeders/MyCategorySeeder.php (NO)

This way I cannot generate two MyCategory.

Execute the command php artisan make:model Shop/MyCategory -a

Model created successfully.
Factory created successfully.

   InvalidArgumentException 

  A CreateMyCategoriesTable class already exists.

  at vendor/laravel/framework/src/Illuminate/Database/Migrations/MigrationCreator.php:102

Remove the

  • model Shop/MyCategory.php,
  • factory Shop/MyCategoryFactory.php
  • migration file 2021_06_01_044253_create_my_categories_table.php

Now let's create the correct migration file

  • php artisan make:migration CreateBlogMyCategoryTable

Again execute the command php artisan make:model Shop/MyCategory -a

Model created successfully.
Factory created successfully.
Created Migration: 2021_06_01_050039_create_my_categories_table
Seeder already exists!
Controller already exists!

It again creates a 2021_06_01_050039_create_my_categories_table file and does not take into account the model in the Shop directory

Remove generated files again:

  • model Shop/MyCategory.php
  • factory Shop/MyCategoryFactory.php
  • migration file 2021_06_01_050039_create_my_categories_table.php
  • controller MyCategoryController.php

Now let's create the correct migration and controllers:

  • php artisan make:migration CreateShopMyCategoryTable
  • php artisan make:controller Blog/MyCategoryController
  • php artisan make:controller Shop/MyCategoryController

Total

Thus, we see that the "-а" option is not suitable in this case. You need to create models, controllers and migrations separately.

php artisan make:controller Blog/MyCategoryController -r
php artisan make:controller Shop/MyCategoryController -r
php artisan make:migration CreateBlogMyCategoryTable
php artisan make:migration CreateShopMyCategoryTable

Model with factory

php artisan make:model Blog/MyCategory -f
php artisan make:model Shop/MyCategory -f

This command also makes the correct Factory

php artisan make:factory Blog\\MyCategoryFactory --model=Blog\\MyCategory

<?php

namespace Database\Factories\Blog;

use App\Models\Blog\MyCategory;
use Illuminate\Database\Eloquent\Factories\Factory;

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

The migration files, models, and controllers as we need in the appropriate directories.

php artisan migrate
Migration table created successfully.
...
Migrating: 2021_06_01_055036_create_blog_my_category_table
Migrated:  2021_06_01_055036_create_blog_my_category_table (36.26ms)
Migrating: 2021_06_01_055541_create_shop_my_category_table
Migrated:  2021_06_01_055541_create_shop_my_category_table (39.16ms)

As I understand it, the required structure will still have to be done by separate commands.

But then another problem appeared: I do not understand how to use now factory()->create()

Route::get('/', function () {
    \App\Models\Blog\MyCategory::factory(1)->create();
    return view('welcome');
});
Illuminate\Database\QueryException
SQLSTATE[42S02]: Base table or view not found: 1146 Table 'larablog.my_categories' doesn't exist (SQL: insert into `my_categories` (`updated_at`, `created_at`) values (2021-06-01 06:59:52, 2021-06-01 06:59:52))

or tinker

php artisan tinker
Psy Shell v0.10.8 (PHP 7.4.18 — cli) by Justin Hileman

>>> MyCategory::factory()->create()
PHP Error:  Class 'MyCategory' not found in Psy Shell code on line 1

>>> Blog\MyCategory::factory()->create()
PHP Error:  Class 'Blog\MyCategory' not found in Psy Shell code on line 1

>>> \Blog\MyCategory::factory()->create()
PHP Error:  Class 'Blog\MyCategory' not found in Psy Shell code on line 1

>>> App\Models\Blog\MyCategory::factory()->create()
Illuminate\Database\QueryException with message 'SQLSTATE[42S02]: Base table or view not found: 1146 Table 'larablog.my_categories' doesn't exist (SQL: insert into `my_categories` (`updated_at`, `created_at`) values (2021-06-01 06:48:26, 2021-06-01 06:48:26))'

>>> \App\Models\Blog\MyCategory::factory()->create()
Illuminate\Database\QueryException with message 'SQLSTATE[42S02]: Base table or view not found: 1146 Table 'larablog.my_categories' doesn't exist (SQL: insert into `my_categories` (`updated_at`, `created_at`) values (2021-06-01 06:48:29, 2021-06-01 06:48:29))'

How to make such a structure work?

2

There are 2 best solutions below

0
On

Sometimes it is necessary to clear the cache, this command worked in my project:

composer dump-autoload

Good luck!

4
On

use php artisan make:model ModelName -mcr -a

it will create all that you need. migration, seeder, factory, controller and model