nova updates

This commit is contained in:
Benjamin Takats
2022-12-01 17:03:52 +01:00
parent 93fd52cd1f
commit ef510043c3
16 changed files with 178 additions and 58 deletions

View File

@@ -33,7 +33,7 @@ class City extends Model
public function getSlugOptions(): SlugOptions public function getSlugOptions(): SlugOptions
{ {
return SlugOptions::create() return SlugOptions::create()
->generateSlugsFrom('name') ->generateSlugsFrom(['country.code', 'name'])
->saveSlugsTo('slug') ->saveSlugsTo('slug')
->usingLanguage('de'); ->usingLanguage('de');
} }

View File

@@ -4,29 +4,41 @@ namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Spatie\Sluggable\HasSlug;
use Spatie\Sluggable\SlugOptions;
class Lecturer extends Model class Lecturer extends Model
{ {
use HasFactory; use HasFactory;
use HasSlug;
/** /**
* The attributes that aren't mass assignable. * The attributes that aren't mass assignable.
*
* @var array * @var array
*/ */
protected $guarded = []; protected $guarded = [];
/** /**
* The attributes that should be cast to native types. * The attributes that should be cast to native types.
*
* @var array * @var array
*/ */
protected $casts = [ protected $casts = [
'id' => 'integer', 'id' => 'integer',
'team_id' => 'integer', 'team_id' => 'integer',
'active' => 'boolean', 'active' => 'boolean',
]; ];
/**
* Get the options for generating the slug.
*/
public function getSlugOptions(): SlugOptions
{
return SlugOptions::create()
->generateSlugsFrom(['name'])
->saveSlugsTo('slug')
->usingLanguage('de');
}
public function team(): \Illuminate\Database\Eloquent\Relations\BelongsTo public function team(): \Illuminate\Database\Eloquent\Relations\BelongsTo
{ {
return $this->belongsTo(Team::class); return $this->belongsTo(Team::class);

View File

@@ -4,28 +4,40 @@ namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Spatie\Sluggable\HasSlug;
use Spatie\Sluggable\SlugOptions;
class Venue extends Model class Venue extends Model
{ {
use HasFactory; use HasFactory;
use HasSlug;
/** /**
* The attributes that aren't mass assignable. * The attributes that aren't mass assignable.
*
* @var array * @var array
*/ */
protected $guarded = []; protected $guarded = [];
/** /**
* The attributes that should be cast to native types. * The attributes that should be cast to native types.
*
* @var array * @var array
*/ */
protected $casts = [ protected $casts = [
'id' => 'integer', 'id' => 'integer',
'city_id' => 'integer', 'city_id' => 'integer',
]; ];
/**
* Get the options for generating the slug.
*/
public function getSlugOptions(): SlugOptions
{
return SlugOptions::create()
->generateSlugsFrom(['city.slug', 'name',])
->saveSlugsTo('slug')
->usingLanguage('de');
}
public function city(): \Illuminate\Database\Eloquent\Relations\BelongsTo public function city(): \Illuminate\Database\Eloquent\Relations\BelongsTo
{ {
return $this->belongsTo(City::class); return $this->belongsTo(City::class);

View File

@@ -21,7 +21,7 @@ class City extends Resource
* *
* @var string * @var string
*/ */
public static $title = 'id'; public static $title = 'name';
/** /**
* The columns that should be searched. * The columns that should be searched.
@@ -30,6 +30,7 @@ class City extends Resource
*/ */
public static $search = [ public static $search = [
'id', 'id',
'name',
]; ];
/** /**
@@ -47,11 +48,10 @@ class City extends Resource
->rules('required', 'string'), ->rules('required', 'string'),
Text::make('Slug') Text::make('Slug')
->rules('required', 'string', 'unique:cities,slug'), ->exceptOnForms(),
BelongsTo::make('Country'), BelongsTo::make('Country'),
]; ];
} }

View File

@@ -21,7 +21,7 @@ class Country extends Resource
* *
* @var string * @var string
*/ */
public static $title = 'id'; public static $title = 'name';
/** /**
* The columns that should be searched. * The columns that should be searched.
@@ -30,6 +30,7 @@ class Country extends Resource
*/ */
public static $search = [ public static $search = [
'id', 'id',
'name',
]; ];
/** /**

View File

@@ -2,55 +2,68 @@
namespace App\Nova; namespace App\Nova;
use Laravel\Nova\Fields\ID;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Laravel\Nova\Fields\Text;
use Laravel\Nova\Fields\BelongsTo; use Laravel\Nova\Fields\BelongsTo;
use Laravel\Nova\Fields\BelongsToMany; use Laravel\Nova\Fields\BelongsToMany;
use Laravel\Nova\Fields\Field;
use Laravel\Nova\Fields\ID;
use Laravel\Nova\Fields\Text;
use Laravel\Nova\Http\Requests\NovaRequest;
use ZiffMedia\NovaSelectPlus\SelectPlus;
class Course extends Resource class Course extends Resource
{ {
/** /**
* The model the resource corresponds to. * The model the resource corresponds to.
*
* @var string * @var string
*/ */
public static $model = \App\Models\Course::class; public static $model = \App\Models\Course::class;
/** /**
* The single value that should be used to represent the resource when being displayed. * The single value that should be used to represent the resource when being displayed.
*
* @var string * @var string
*/ */
public static $title = 'id'; public static $title = 'id';
/** /**
* The columns that should be searched. * The columns that should be searched.
*
* @var array * @var array
*/ */
public static $search = [ public static $search = [
'id', 'id',
]; ];
public static function relatableLecturers(NovaRequest $request, $query, Field $field)
{
if ($field instanceof BelongsTo) {
$query->where('team_id', $request->user()->current_team_id);
}
return $query;
}
/** /**
* Get the fields displayed by the resource. * Get the fields displayed by the resource.
* *
* @param \Illuminate\Http\Request $request * @param \Illuminate\Http\Request $request
*
* @return array * @return array
*/ */
public function fields(Request $request) public function fields(Request $request)
{ {
return [ return [
ID::make()->sortable(), ID::make()
->sortable(),
Text::make('Name') Text::make('Name')
->rules('required', 'string'), ->rules('required', 'string'),
BelongsTo::make('Lecturer'), BelongsTo::make('Lecturer'),
BelongsToMany::make('Categories'), SelectPlus::make('Categories', 'categories', Category::class)
->usingIndexLabel('name'),
BelongsToMany::make('Categories')->onlyOnDetail(),
]; ];
} }
@@ -59,6 +72,7 @@ class Course extends Resource
* Get the cards available for the request. * Get the cards available for the request.
* *
* @param \Illuminate\Http\Request $request * @param \Illuminate\Http\Request $request
*
* @return array * @return array
*/ */
public function cards(Request $request) public function cards(Request $request)
@@ -70,6 +84,7 @@ class Course extends Resource
* Get the filters available for the resource. * Get the filters available for the resource.
* *
* @param \Illuminate\Http\Request $request * @param \Illuminate\Http\Request $request
*
* @return array * @return array
*/ */
public function filters(Request $request) public function filters(Request $request)
@@ -81,6 +96,7 @@ class Course extends Resource
* Get the lenses available for the resource. * Get the lenses available for the resource.
* *
* @param \Illuminate\Http\Request $request * @param \Illuminate\Http\Request $request
*
* @return array * @return array
*/ */
public function lenses(Request $request) public function lenses(Request $request)
@@ -92,6 +108,7 @@ class Course extends Resource
* Get the actions available for the resource. * Get the actions available for the resource.
* *
* @param \Illuminate\Http\Request $request * @param \Illuminate\Http\Request $request
*
* @return array * @return array
*/ */
public function actions(Request $request) public function actions(Request $request)

View File

@@ -2,60 +2,72 @@
namespace App\Nova; namespace App\Nova;
use Laravel\Nova\Fields\ID;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Laravel\Nova\Fields\Text;
use Laravel\Nova\Fields\Boolean;
use Laravel\Nova\Fields\BelongsTo; use Laravel\Nova\Fields\BelongsTo;
use Laravel\Nova\Fields\Boolean;
use Laravel\Nova\Fields\Field;
use Laravel\Nova\Fields\ID;
use Laravel\Nova\Fields\Text;
use Laravel\Nova\Http\Requests\NovaRequest;
class Lecturer extends Resource class Lecturer extends Resource
{ {
/** /**
* The model the resource corresponds to. * The model the resource corresponds to.
*
* @var string * @var string
*/ */
public static $model = \App\Models\Lecturer::class; public static $model = \App\Models\Lecturer::class;
/** /**
* The single value that should be used to represent the resource when being displayed. * The single value that should be used to represent the resource when being displayed.
*
* @var string * @var string
*/ */
public static $title = 'id'; public static $title = 'name';
/** /**
* The columns that should be searched. * The columns that should be searched.
*
* @var array * @var array
*/ */
public static $search = [ public static $search = [
'id', 'id',
'name',
]; ];
public static function relatableTeams(NovaRequest $request, $query, Field $field)
{
if ($field instanceof BelongsTo) {
$query->where('id', $request->user()->current_team_id);
}
return $query;
}
/** /**
* Get the fields displayed by the resource. * Get the fields displayed by the resource.
* *
* @param \Illuminate\Http\Request $request * @param \Illuminate\Http\Request $request
*
* @return array * @return array
*/ */
public function fields(Request $request) public function fields(Request $request)
{ {
return [ return [
ID::make()->sortable(), ID::make()
->sortable(),
Text::make('Name') Text::make('Name')
->rules('required', 'string'), ->rules('required', 'string'),
Text::make('Slug') Text::make('Slug')
->rules('required', 'string', 'unique:lecturers,slug'), ->rules('required', 'string', 'unique:lecturers,slug')
->exceptOnForms(),
Boolean::make('Active') Boolean::make('Active')
->rules('required'), ->rules('required')
->default(true),
BelongsTo::make('Team'), BelongsTo::make('Team'),
]; ];
} }
@@ -63,6 +75,7 @@ class Lecturer extends Resource
* Get the cards available for the request. * Get the cards available for the request.
* *
* @param \Illuminate\Http\Request $request * @param \Illuminate\Http\Request $request
*
* @return array * @return array
*/ */
public function cards(Request $request) public function cards(Request $request)
@@ -74,6 +87,7 @@ class Lecturer extends Resource
* Get the filters available for the resource. * Get the filters available for the resource.
* *
* @param \Illuminate\Http\Request $request * @param \Illuminate\Http\Request $request
*
* @return array * @return array
*/ */
public function filters(Request $request) public function filters(Request $request)
@@ -85,6 +99,7 @@ class Lecturer extends Resource
* Get the lenses available for the resource. * Get the lenses available for the resource.
* *
* @param \Illuminate\Http\Request $request * @param \Illuminate\Http\Request $request
*
* @return array * @return array
*/ */
public function lenses(Request $request) public function lenses(Request $request)
@@ -96,6 +111,7 @@ class Lecturer extends Resource
* Get the actions available for the resource. * Get the actions available for the resource.
* *
* @param \Illuminate\Http\Request $request * @param \Illuminate\Http\Request $request
*
* @return array * @return array
*/ */
public function actions(Request $request) public function actions(Request $request)

View File

@@ -2,59 +2,58 @@
namespace App\Nova; namespace App\Nova;
use Laravel\Nova\Fields\ID;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Laravel\Nova\Fields\Text;
use Laravel\Nova\Fields\BelongsTo; use Laravel\Nova\Fields\BelongsTo;
use Laravel\Nova\Fields\ID;
use Laravel\Nova\Fields\Text;
class Venue extends Resource class Venue extends Resource
{ {
/** /**
* The model the resource corresponds to. * The model the resource corresponds to.
*
* @var string * @var string
*/ */
public static $model = \App\Models\Venue::class; public static $model = \App\Models\Venue::class;
/** /**
* The single value that should be used to represent the resource when being displayed. * The single value that should be used to represent the resource when being displayed.
*
* @var string * @var string
*/ */
public static $title = 'id'; public static $title = 'name';
/** /**
* The columns that should be searched. * The columns that should be searched.
*
* @var array * @var array
*/ */
public static $search = [ public static $search = [
'id', 'id',
'name',
]; ];
/** /**
* Get the fields displayed by the resource. * Get the fields displayed by the resource.
* *
* @param \Illuminate\Http\Request $request * @param \Illuminate\Http\Request $request
*
* @return array * @return array
*/ */
public function fields(Request $request) public function fields(Request $request)
{ {
return [ return [
ID::make()->sortable(), ID::make()
->sortable(),
Text::make('Name') Text::make('Name')
->rules('required', 'string'), ->rules('required', 'string'),
Text::make('Slug') Text::make('Slug')
->rules('required', 'string', 'unique:venues,slug'), ->exceptOnForms(),
Text::make('Street') Text::make('Street')
->rules('required', 'string'), ->rules('required', 'string'),
BelongsTo::make('City'), BelongsTo::make('City'),
]; ];
} }
@@ -62,6 +61,7 @@ class Venue extends Resource
* Get the cards available for the request. * Get the cards available for the request.
* *
* @param \Illuminate\Http\Request $request * @param \Illuminate\Http\Request $request
*
* @return array * @return array
*/ */
public function cards(Request $request) public function cards(Request $request)
@@ -73,6 +73,7 @@ class Venue extends Resource
* Get the filters available for the resource. * Get the filters available for the resource.
* *
* @param \Illuminate\Http\Request $request * @param \Illuminate\Http\Request $request
*
* @return array * @return array
*/ */
public function filters(Request $request) public function filters(Request $request)
@@ -84,6 +85,7 @@ class Venue extends Resource
* Get the lenses available for the resource. * Get the lenses available for the resource.
* *
* @param \Illuminate\Http\Request $request * @param \Illuminate\Http\Request $request
*
* @return array * @return array
*/ */
public function lenses(Request $request) public function lenses(Request $request)
@@ -95,6 +97,7 @@ class Venue extends Resource
* Get the actions available for the resource. * Get the actions available for the resource.
* *
* @param \Illuminate\Http\Request $request * @param \Illuminate\Http\Request $request
*
* @return array * @return array
*/ */
public function actions(Request $request) public function actions(Request $request)

View File

@@ -30,7 +30,7 @@ class CityPolicy
*/ */
public function view(User $user, City $city) public function view(User $user, City $city)
{ {
// return $user->is_lecturer;
} }
/** /**
@@ -41,7 +41,7 @@ class CityPolicy
*/ */
public function create(User $user) public function create(User $user)
{ {
// return $user->is_lecturer;
} }
/** /**

View File

@@ -30,7 +30,7 @@ class CoursePolicy
*/ */
public function view(User $user, Course $course) public function view(User $user, Course $course)
{ {
// return $user->is_lecturer;
} }
/** /**
@@ -41,7 +41,7 @@ class CoursePolicy
*/ */
public function create(User $user) public function create(User $user)
{ {
// return $user->is_lecturer;
} }
/** /**
@@ -53,7 +53,7 @@ class CoursePolicy
*/ */
public function update(User $user, Course $course) public function update(User $user, Course $course)
{ {
// return $user->belongsToTeam($course->lecturer->team);
} }
/** /**

View File

@@ -14,6 +14,7 @@ class LecturerPolicy
* Determine whether the user can view any models. * Determine whether the user can view any models.
* *
* @param \App\Models\User $user * @param \App\Models\User $user
*
* @return \Illuminate\Auth\Access\Response|bool * @return \Illuminate\Auth\Access\Response|bool
*/ */
public function viewAny(User $user) public function viewAny(User $user)
@@ -26,22 +27,24 @@ class LecturerPolicy
* *
* @param \App\Models\User $user * @param \App\Models\User $user
* @param \App\Models\Lecturer $lecturer * @param \App\Models\Lecturer $lecturer
*
* @return \Illuminate\Auth\Access\Response|bool * @return \Illuminate\Auth\Access\Response|bool
*/ */
public function view(User $user, Lecturer $lecturer) public function view(User $user, Lecturer $lecturer)
{ {
return false; return $user->is_lecturer;
} }
/** /**
* Determine whether the user can create models. * Determine whether the user can create models.
* *
* @param \App\Models\User $user * @param \App\Models\User $user
*
* @return \Illuminate\Auth\Access\Response|bool * @return \Illuminate\Auth\Access\Response|bool
*/ */
public function create(User $user) public function create(User $user)
{ {
// return $user->is_lecturer;
} }
/** /**
@@ -49,11 +52,12 @@ class LecturerPolicy
* *
* @param \App\Models\User $user * @param \App\Models\User $user
* @param \App\Models\Lecturer $lecturer * @param \App\Models\Lecturer $lecturer
*
* @return \Illuminate\Auth\Access\Response|bool * @return \Illuminate\Auth\Access\Response|bool
*/ */
public function update(User $user, Lecturer $lecturer) public function update(User $user, Lecturer $lecturer)
{ {
// return $user->belongsToTeam($lecturer->team);
} }
/** /**
@@ -61,6 +65,7 @@ class LecturerPolicy
* *
* @param \App\Models\User $user * @param \App\Models\User $user
* @param \App\Models\Lecturer $lecturer * @param \App\Models\Lecturer $lecturer
*
* @return \Illuminate\Auth\Access\Response|bool * @return \Illuminate\Auth\Access\Response|bool
*/ */
public function delete(User $user, Lecturer $lecturer) public function delete(User $user, Lecturer $lecturer)
@@ -73,6 +78,7 @@ class LecturerPolicy
* *
* @param \App\Models\User $user * @param \App\Models\User $user
* @param \App\Models\Lecturer $lecturer * @param \App\Models\Lecturer $lecturer
*
* @return \Illuminate\Auth\Access\Response|bool * @return \Illuminate\Auth\Access\Response|bool
*/ */
public function restore(User $user, Lecturer $lecturer) public function restore(User $user, Lecturer $lecturer)
@@ -85,6 +91,7 @@ class LecturerPolicy
* *
* @param \App\Models\User $user * @param \App\Models\User $user
* @param \App\Models\Lecturer $lecturer * @param \App\Models\Lecturer $lecturer
*
* @return \Illuminate\Auth\Access\Response|bool * @return \Illuminate\Auth\Access\Response|bool
*/ */
public function forceDelete(User $user, Lecturer $lecturer) public function forceDelete(User $user, Lecturer $lecturer)

View File

@@ -30,7 +30,7 @@ class VenuePolicy
*/ */
public function view(User $user, Venue $venue) public function view(User $user, Venue $venue)
{ {
// return $user->is_lecturer;
} }
/** /**
@@ -41,7 +41,7 @@ class VenuePolicy
*/ */
public function create(User $user) public function create(User $user)
{ {
// return $user->is_lecturer;
} }
/** /**

View File

@@ -39,8 +39,8 @@ class NovaServiceProvider extends NovaApplicationServiceProvider
MenuSection::make('Schule', [ MenuSection::make('Schule', [
MenuItem::resource(City::class), MenuItem::resource(City::class),
MenuItem::resource(Lecturer::class),
MenuItem::resource(Venue::class), MenuItem::resource(Venue::class),
MenuItem::resource(Lecturer::class),
MenuItem::resource(Course::class), MenuItem::resource(Course::class),
MenuItem::resource(Event::class), MenuItem::resource(Event::class),
MenuItem::resource(Participant::class), MenuItem::resource(Participant::class),

View File

@@ -17,12 +17,13 @@
"laravel/sanctum": "^3.0", "laravel/sanctum": "^3.0",
"laravel/tinker": "^2.7", "laravel/tinker": "^2.7",
"livewire/livewire": "^2.5", "livewire/livewire": "^2.5",
"nova/start": "*",
"rappasoft/laravel-livewire-tables": "^2.8", "rappasoft/laravel-livewire-tables": "^2.8",
"spatie/laravel-google-fonts": "^1.2", "spatie/laravel-google-fonts": "^1.2",
"spatie/laravel-sluggable": "^3.4", "spatie/laravel-sluggable": "^3.4",
"stijnvanouplines/blade-country-flags": "^1.0", "stijnvanouplines/blade-country-flags": "^1.0",
"wireui/wireui": "^1.17", "wireui/wireui": "^1.17",
"nova/start": "*" "ziffmedia/nova-select-plus": "^2.0"
}, },
"require-dev": { "require-dev": {
"fakerphp/faker": "^1.9.1", "fakerphp/faker": "^1.9.1",

57
composer.lock generated
View File

@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "fe688c8ea9a0c69b1cff7d3876e83e4f", "content-hash": "0946bfc7eeb16ba3f6719a28461cd673",
"packages": [ "packages": [
{ {
"name": "bacon/bacon-qr-code", "name": "bacon/bacon-qr-code",
@@ -7634,6 +7634,61 @@
} }
], ],
"time": "2022-11-28T17:38:50+00:00" "time": "2022-11-28T17:38:50+00:00"
},
{
"name": "ziffmedia/nova-select-plus",
"version": "v2.0.0",
"source": {
"type": "git",
"url": "https://github.com/ziffmedia/nova-select-plus.git",
"reference": "99d3edca015ee9dcd79fb4855b7deacb98f31771"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/ziffmedia/nova-select-plus/zipball/99d3edca015ee9dcd79fb4855b7deacb98f31771",
"reference": "99d3edca015ee9dcd79fb4855b7deacb98f31771",
"shasum": ""
},
"require": {
"laravel/nova": "^4.0",
"php": "^7.3|^8.0"
},
"type": "library",
"extra": {
"laravel": {
"providers": [
"ZiffMedia\\NovaSelectPlus\\FieldServiceProvider"
]
}
},
"autoload": {
"psr-4": {
"ZiffMedia\\NovaSelectPlus\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Ralph Schindler",
"email": "ralph.schindler@ziffmedia.com"
}
],
"description": "A Nova select field for simple and complex select inputs",
"keywords": [
"ajax",
"laravel",
"nova",
"select",
"vue-select"
],
"support": {
"issues": "https://github.com/ziffmedia/nova-select-plus/issues",
"source": "https://github.com/ziffmedia/nova-select-plus/tree/v2.0.0"
},
"time": "2022-08-29T18:16:54+00:00"
} }
], ],
"packages-dev": [ "packages-dev": [

View File

@@ -36,6 +36,7 @@ class DatabaseSeeder extends Seeder
'email_verified_at' => now(), 'email_verified_at' => now(),
'password' => bcrypt('1234'), 'password' => bcrypt('1234'),
'remember_token' => Str::random(10), 'remember_token' => Str::random(10),
'is_lecturer' => true,
]); ]);
$team = Team::create([ $team = Team::create([
'name' => 'Admin Team', 'name' => 'Admin Team',
@@ -59,28 +60,23 @@ class DatabaseSeeder extends Seeder
City::create([ City::create([
'country_id' => 1, 'country_id' => 1,
'name' => 'Füssen', 'name' => 'Füssen',
'slug' => str('Füssen')->slug('-', 'de'),
]); ]);
City::create([ City::create([
'country_id' => 2, 'country_id' => 2,
'name' => 'Wien', 'name' => 'Wien',
'slug' => str('Wien')->slug('-', 'de'),
]); ]);
City::create([ City::create([
'country_id' => 3, 'country_id' => 3,
'name' => 'Zürich', 'name' => 'Zürich',
'slug' => str('Zürich')->slug('-', 'de'),
]); ]);
Venue::create([ Venue::create([
'city_id' => 1, 'city_id' => 1,
'name' => 'The Blue Studio Coworking', 'name' => 'The Blue Studio Coworking',
'slug' => str('The Blue Studio Coworking')->slug('-', 'de'),
'street' => 'Teststraße 12', 'street' => 'Teststraße 12',
]); ]);
Lecturer::create([ Lecturer::create([
'team_id' => 1, 'team_id' => 1,
'name' => 'Markus Turm', 'name' => 'Markus Turm',
'slug' => str('Markus Turm')->slug('-', 'de'),
'active' => true, 'active' => true,
]); ]);
$category = Category::create([ $category = Category::create([