Add backend categories
This commit is contained in:
parent
9b9bd4ff7b
commit
f46280eb2b
11 changed files with 137 additions and 40 deletions
|
@ -1 +1 @@
|
||||||
{"php":"8.0.13","version":"3.0.0","indent":" ","lineEnding":"\n","rules":{"blank_line_after_opening_tag":true,"braces":{"allow_single_line_anonymous_class_with_empty_body":true},"compact_nullable_typehint":true,"declare_equal_normalize":true,"lowercase_cast":true,"lowercase_static_reference":true,"new_with_braces":true,"no_blank_lines_after_class_opening":true,"no_leading_import_slash":true,"no_whitespace_in_blank_line":true,"ordered_class_elements":{"order":["use_trait"]},"ordered_imports":{"imports_order":["class","function","const"],"sort_algorithm":"none"},"return_type_declaration":true,"short_scalar_cast":true,"single_blank_line_before_namespace":true,"single_trait_insert_per_statement":true,"ternary_operator_spaces":true,"visibility_required":{"elements":["const","method","property"]},"blank_line_after_namespace":true,"class_definition":true,"constant_case":true,"elseif":true,"function_declaration":true,"indentation_type":true,"line_ending":true,"lowercase_keywords":true,"method_argument_space":{"on_multiline":"ensure_fully_multiline"},"no_break_comment":true,"no_closing_tag":true,"no_spaces_after_function_name":true,"no_spaces_inside_parenthesis":true,"no_trailing_whitespace":true,"no_trailing_whitespace_in_comment":true,"single_blank_line_at_eof":true,"single_class_element_per_statement":{"elements":["property"]},"single_import_per_statement":true,"single_line_after_imports":true,"switch_case_semicolon_to_colon":true,"switch_case_space":true,"encoding":true,"full_opening_tag":true},"hashes":{"\/run\/user\/1000\/neoformat\/product.blade.php":1493321553,"\/tmp\/neoformat\/user.blade.php":2134171036,"\/tmp\/neoformat\/edit.blade.php":2692964585,"\/tmp\/neoformat\/ProductController.php":4228240463}}
|
{"php":"8.0.13","version":"3.0.0","indent":" ","lineEnding":"\n","rules":{"blank_line_after_opening_tag":true,"braces":{"allow_single_line_anonymous_class_with_empty_body":true},"compact_nullable_typehint":true,"declare_equal_normalize":true,"lowercase_cast":true,"lowercase_static_reference":true,"new_with_braces":true,"no_blank_lines_after_class_opening":true,"no_leading_import_slash":true,"no_whitespace_in_blank_line":true,"ordered_class_elements":{"order":["use_trait"]},"ordered_imports":{"imports_order":["class","function","const"],"sort_algorithm":"none"},"return_type_declaration":true,"short_scalar_cast":true,"single_blank_line_before_namespace":true,"single_trait_insert_per_statement":true,"ternary_operator_spaces":true,"visibility_required":{"elements":["const","method","property"]},"blank_line_after_namespace":true,"class_definition":true,"constant_case":true,"elseif":true,"function_declaration":true,"indentation_type":true,"line_ending":true,"lowercase_keywords":true,"method_argument_space":{"on_multiline":"ensure_fully_multiline"},"no_break_comment":true,"no_closing_tag":true,"no_spaces_after_function_name":true,"no_spaces_inside_parenthesis":true,"no_trailing_whitespace":true,"no_trailing_whitespace_in_comment":true,"single_blank_line_at_eof":true,"single_class_element_per_statement":{"elements":["property"]},"single_import_per_statement":true,"single_line_after_imports":true,"switch_case_semicolon_to_colon":true,"switch_case_space":true,"encoding":true,"full_opening_tag":true},"hashes":{"\/run\/user\/1000\/neoformat\/product.blade.php":1493321553,"\/tmp\/neoformat\/user.blade.php":2134171036,"\/tmp\/neoformat\/edit.blade.php":2692964585,"\/tmp\/neoformat\/ProductController.php":4228240463,"\/tmp\/neoformat\/DatabaseSeeder.php":3199248297}}
|
32
app/Faker/CategoryNameProvider.php
Normal file
32
app/Faker/CategoryNameProvider.php
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Faker;
|
||||||
|
|
||||||
|
use Faker\Provider\Base;
|
||||||
|
|
||||||
|
class CategoryNameProvider extends Base
|
||||||
|
{
|
||||||
|
protected static $categories = [
|
||||||
|
"żywioły",
|
||||||
|
"wody",
|
||||||
|
"pierwiastki",
|
||||||
|
"racje",
|
||||||
|
"plastik",
|
||||||
|
"naturalne",
|
||||||
|
"rzeczywiste",
|
||||||
|
"A|B",
|
||||||
|
"moduły node",
|
||||||
|
"kontenery",
|
||||||
|
"filmy",
|
||||||
|
"bajki",
|
||||||
|
"maszyny",
|
||||||
|
"challenge",
|
||||||
|
"śmieci",
|
||||||
|
|
||||||
|
];
|
||||||
|
|
||||||
|
public function categoryName(): string
|
||||||
|
{
|
||||||
|
return static::randomElement(static::$categories);
|
||||||
|
}
|
||||||
|
}
|
22
app/Models/Category.php
Normal file
22
app/Models/Category.php
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Models;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
|
||||||
|
class Category extends Model
|
||||||
|
{
|
||||||
|
use HasFactory, HasUUID;
|
||||||
|
public $primaryKey = "uuid";
|
||||||
|
|
||||||
|
protected $fillable = ['name'];
|
||||||
|
|
||||||
|
public function products() {
|
||||||
|
return $this->belongsToMany(Category::class,'categories_products','category_uuid');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function image() {
|
||||||
|
return $this->morphOne(Image::class, 'imageable');
|
||||||
|
}
|
||||||
|
}
|
|
@ -11,11 +11,14 @@ class Product extends Model
|
||||||
use HasUUID;
|
use HasUUID;
|
||||||
public $primaryKey = "uuid";
|
public $primaryKey = "uuid";
|
||||||
|
|
||||||
public function images()
|
public function images() {
|
||||||
{
|
|
||||||
return $this->morphMany(Image::class, 'imageable');
|
return $this->morphMany(Image::class, 'imageable');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function categories() {
|
||||||
|
return $this->belongsToMany(Category::class,'categories_products','product_uuid');
|
||||||
|
}
|
||||||
|
|
||||||
protected $fillable = [
|
protected $fillable = [
|
||||||
'name',
|
'name',
|
||||||
'description',
|
'description',
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
namespace App\Providers;
|
namespace App\Providers;
|
||||||
|
|
||||||
|
use App\Faker\CategoryNameProvider;
|
||||||
use App\Faker\ProductNameProvider;
|
use App\Faker\ProductNameProvider;
|
||||||
use Illuminate\Support\ServiceProvider;
|
use Illuminate\Support\ServiceProvider;
|
||||||
|
|
||||||
|
@ -20,6 +21,7 @@ class FakerServiceProvider extends ServiceProvider
|
||||||
$this->app->singleton(Generator::class, function () {
|
$this->app->singleton(Generator::class, function () {
|
||||||
$faker = Factory::create();
|
$faker = Factory::create();
|
||||||
$faker->addProvider(new ProductNameProvider($faker));
|
$faker->addProvider(new ProductNameProvider($faker));
|
||||||
|
$faker->addProvider(new CategoryNameProvider($faker));
|
||||||
return $faker;
|
return $faker;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
29
database/factories/CategoryFactory.php
Normal file
29
database/factories/CategoryFactory.php
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Database\Factories;
|
||||||
|
|
||||||
|
use App\Models\Category;
|
||||||
|
use App\Models\Order;
|
||||||
|
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->categoryName(),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
|
@ -4,7 +4,6 @@ namespace Database\Factories;
|
||||||
|
|
||||||
use App\Models\Product;
|
use App\Models\Product;
|
||||||
use Illuminate\Database\Eloquent\Factories\Factory;
|
use Illuminate\Database\Eloquent\Factories\Factory;
|
||||||
use illuminate\support\str;
|
|
||||||
|
|
||||||
class ProductFactory extends Factory
|
class ProductFactory extends Factory
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,35 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
use Illuminate\Database\Migrations\Migration;
|
|
||||||
use Illuminate\Database\Schema\Blueprint;
|
|
||||||
use Illuminate\Support\Facades\DB;
|
|
||||||
use Illuminate\Support\Facades\Schema;
|
|
||||||
|
|
||||||
class AddCategories extends Migration
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Run the migrations.
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function up()
|
|
||||||
{
|
|
||||||
Schema::table("images", function(Blueprint $table) {
|
|
||||||
$table->uuidMorphs("imageable");
|
|
||||||
});
|
|
||||||
Schema::table("images", function(Blueprint $table) {
|
|
||||||
DB::table("images")->update(['imageable_id'=>DB::raw('`product_uuid`')], ['imageable_type' => "App\Models\Product"]);
|
|
||||||
$table->dropConstrainedForeignId("product_uuid");
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Reverse the migrations.
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function down()
|
|
||||||
{
|
|
||||||
// Ehh don't wanna bother
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -0,0 +1,41 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
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->uuid("uuid")->primary();
|
||||||
|
$table->timestamps();
|
||||||
|
|
||||||
|
$table->string("name")->index()->unique();
|
||||||
|
});
|
||||||
|
|
||||||
|
Schema::create('categories_products', function (Blueprint $table) {
|
||||||
|
$table->id();
|
||||||
|
$table->timestamps();
|
||||||
|
|
||||||
|
$table->foreignUuid("product_uuid")->references("uuid")->on("products");
|
||||||
|
$table->foreignUuid("category_uuid")->references("uuid")->on("categories");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function down()
|
||||||
|
{
|
||||||
|
Schema::dropIfExists('categories');
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
namespace Database\Seeders;
|
namespace Database\Seeders;
|
||||||
|
|
||||||
|
use App\Models\Category;
|
||||||
use App\Models\Image;
|
use App\Models\Image;
|
||||||
use App\Models\User;
|
use App\Models\User;
|
||||||
use Illuminate\Database\Seeder;
|
use Illuminate\Database\Seeder;
|
||||||
|
@ -17,6 +18,7 @@ class DatabaseSeeder extends Seeder
|
||||||
public function run()
|
public function run()
|
||||||
{
|
{
|
||||||
User::factory(10)->create();
|
User::factory(10)->create();
|
||||||
|
|
||||||
$creds = [
|
$creds = [
|
||||||
'email' => config('admin.email'),
|
'email' => config('admin.email'),
|
||||||
'name' => config('admin.username'),
|
'name' => config('admin.username'),
|
||||||
|
@ -27,6 +29,7 @@ class DatabaseSeeder extends Seeder
|
||||||
$user->admin = true;
|
$user->admin = true;
|
||||||
$user->save();
|
$user->save();
|
||||||
|
|
||||||
\App\Models\Product::factory(10)->has(Image::factory()->count(3))->create();
|
$categories = Category::factory()->count(4)->create();
|
||||||
|
\App\Models\Product::factory(10)->has(Image::factory()->count(3))->hasAttached($categories)->create();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
<div class="product-container">
|
<div class="product-container">
|
||||||
<div class="product-container-left">
|
<div class="product-container-left">
|
||||||
<img class="product-image" src="@if(isset($product->images[0])) {{ $product->images[0]->URL() }} @else {{ asset("test.txt") }} @endif">
|
<img class="product-image" src="@if(isset($product->images[0])) {{ $product->images[0]->URL() }} @else {{ asset("test.txt") }} @endif">
|
||||||
|
{{ dd($product->categories[0]->name) }}
|
||||||
<div class="name-price-container">
|
<div class="name-price-container">
|
||||||
<h2 class="product-name"> {{ $product->name }} </h2>
|
<h2 class="product-name"> {{ $product->name }} </h2>
|
||||||
<h3>{{ ($product->price) }}<span class="price-currency">zł</span></h3>
|
<h3>{{ ($product->price) }}<span class="price-currency">zł</span></h3>
|
||||||
|
|
Loading…
Reference in a new issue