Skip to content

Commit

Permalink
init
Browse files Browse the repository at this point in the history
  • Loading branch information
yrdevel committed Sep 9, 2022
1 parent 0985ba2 commit 34881f3
Show file tree
Hide file tree
Showing 18 changed files with 602 additions and 6 deletions.
11 changes: 11 additions & 0 deletions app/Enum/OrderFieldsFieldEnum.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?php

namespace App\Enum;

enum OrderFieldsFieldEnum: int
{

case url = 1;
case email = 2;
case phone = 3;
}
11 changes: 11 additions & 0 deletions app/Enum/OrderStatusEnum.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?php

namespace App\Enum;

enum OrderStatusEnum: int
{

case new = 0;
case paid = 1;
case completed = 2;
}
22 changes: 18 additions & 4 deletions app/Http/Controllers/Public/CategoryController.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,21 +4,35 @@

use App\Http\Controllers\Controller;
use App\Models\Category;
use App\Models\Product;
use Artesaos\SEOTools\Traits\SEOTools;
use Illuminate\Contracts\View\View;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;

class CategoryController extends Controller
{

public function index(Category $category, string $subCategory = null)
public function index(Category $category, string $subCategory = null): View
{

if (!empty($subCategory)) {
$subCategory = $category->childCategories()->where(['slug' => $subCategory])->firstOrFail();

$currentCategory = $category;
if ($subCategory ?? null) {
$currentCategory = $category->childCategories()->where(['slug' => $subCategory])->firstOrFail();

/* @var \App\Models\Category $currentCategory */
$products = $currentCategory->products()->get();
} else {
$products = $currentCategory->products()->get();
foreach ($category->childCategories as $childCategory)
{
$products = $products->merge($childCategory->products()->get());
}
}

dd($category->toArray(), $subCategory->toArray());

return view('public.category', ['category' => $currentCategory, 'products' => $products]);

}
}
45 changes: 45 additions & 0 deletions app/Models/Cart.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;

/**
* App\Models\Cart
*
* @property int $id
* @property \Illuminate\Support\Carbon|null $created_at
* @property \Illuminate\Support\Carbon|null $updated_at
* @property int|null $user_id
* @property int $product_id
* @property int $count
* @property string|null $session_id
* @method static Builder|Cart newModelQuery()
* @method static Builder|Cart newQuery()
* @method static Builder|Cart query()
* @method static Builder|Cart whereCount($value)
* @method static Builder|Cart whereCreatedAt($value)
* @method static Builder|Cart whereId($value)
* @method static Builder|Cart whereProductId($value)
* @method static Builder|Cart whereSessionId($value)
* @method static Builder|Cart whereUpdatedAt($value)
* @method static Builder|Cart whereUserId($value)
* @mixin \Eloquent
*/
class Cart extends Model
{
use HasFactory;

protected function user(): BelongsTo
{
return $this->belongsTo(User::class);
}

protected function product(): BelongsTo
{
return $this->belongsTo(Product::class);
}
}
16 changes: 16 additions & 0 deletions app/Models/Category.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\HasManyThrough;
use Spatie\Translatable\HasTranslations;

/**
Expand Down Expand Up @@ -40,6 +42,10 @@
* @method static Builder|Category whereMetaTitle($value)
* @method static Builder|Category whereSlug($value)
* @method static Builder|Category whereSort($value)
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Product[] $products
* @property-read int|null $products_count
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Product[] $subProducts
* @property-read int|null $sub_products_count
*/
class Category extends Model
{
Expand All @@ -61,4 +67,14 @@ public function childCategories(): HasMany
{
return $this->hasMany(Category::class);
}

public function subProducts(): HasManyThrough
{
return $this->hasManyThrough(Product::class, self::class, 'category_id', 'category_id');
}

public function products(): BelongsToMany
{
return $this->belongsToMany(Product::class, ProductCategory::class, 'category_id', 'product_id');
}
}
43 changes: 43 additions & 0 deletions app/Models/Order.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
<?php

namespace App\Models;

use App\Enum\OrderStatusEnum;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;

/**
* App\Models\Order
*
* @property int $id
* @property \Illuminate\Support\Carbon|null $created_at
* @property \Illuminate\Support\Carbon|null $updated_at
* @property int|null $user_id
* @property int $status
* @property string $price
* @method static Builder|Order newModelQuery()
* @method static Builder|Order newQuery()
* @method static Builder|Order query()
* @method static Builder|Order whereCreatedAt($value)
* @method static Builder|Order whereId($value)
* @method static Builder|Order wherePrice($value)
* @method static Builder|Order whereStatus($value)
* @method static Builder|Order whereUpdatedAt($value)
* @method static Builder|Order whereUserId($value)
* @mixin \Eloquent
*/
class Order extends Model
{
use HasFactory;

protected $casts = [
'status' => OrderStatusEnum::class,
];

public function user(): BelongsTo
{
return $this->belongsTo(User::class);
}
}
43 changes: 43 additions & 0 deletions app/Models/OrderField.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
<?php

namespace App\Models;

use App\Enum\OrderFieldsFieldEnum;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;

/**
* App\Models\OrderField
*
* @property int $id
* @property \Illuminate\Support\Carbon|null $created_at
* @property \Illuminate\Support\Carbon|null $updated_at
* @property int $order_id
* @property int $field
* @property string $value
* @method static Builder|OrderField newModelQuery()
* @method static Builder|OrderField newQuery()
* @method static Builder|OrderField query()
* @method static Builder|OrderField whereCreatedAt($value)
* @method static Builder|OrderField whereField($value)
* @method static Builder|OrderField whereId($value)
* @method static Builder|OrderField whereOrderId($value)
* @method static Builder|OrderField whereUpdatedAt($value)
* @method static Builder|OrderField whereValue($value)
* @mixin \Eloquent
*/
class OrderField extends Model
{
use HasFactory;

protected $casts = [
'field' => OrderFieldsFieldEnum::class,
];

protected function order(): BelongsTo
{
return $this->belongsTo(Order::class);
}
}
45 changes: 45 additions & 0 deletions app/Models/OrderProduct.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;

/**
* App\Models\OrderProduct
*
* @property int $id
* @property \Illuminate\Support\Carbon|null $created_at
* @property \Illuminate\Support\Carbon|null $updated_at
* @property int $order_id
* @property int $product_id
* @property int $count
* @property string $price
* @method static Builder|OrderProduct newModelQuery()
* @method static Builder|OrderProduct newQuery()
* @method static Builder|OrderProduct query()
* @method static Builder|OrderProduct whereCount($value)
* @method static Builder|OrderProduct whereCreatedAt($value)
* @method static Builder|OrderProduct whereId($value)
* @method static Builder|OrderProduct whereOrderId($value)
* @method static Builder|OrderProduct wherePrice($value)
* @method static Builder|OrderProduct whereProductId($value)
* @method static Builder|OrderProduct whereUpdatedAt($value)
* @mixin \Eloquent
*/
class OrderProduct extends Model
{
use HasFactory;

protected function order(): BelongsTo
{
return $this->belongsTo(Order::class);
}

protected function product(): BelongsTo
{
return $this->belongsTo(Product::class);
}
}
15 changes: 14 additions & 1 deletion app/Models/Product.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
use Illuminate\Database\Eloquent\Casts\AsArrayObject;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasManyThrough;
use Illuminate\Database\Eloquent\SoftDeletes;
use Spatie\Translatable\HasTranslations;

/**
Expand Down Expand Up @@ -39,10 +41,16 @@
* @property mixed $meta_description
* @method static Builder|Product whereMetaDescription($value)
* @method static Builder|Product whereMetaTitle($value)
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Category[] $inCategories
* @property-read int|null $in_categories_count
* @method static \Database\Factories\ProductFactory factory(...$parameters)
* @method static \Illuminate\Database\Query\Builder|Product onlyTrashed()
* @method static \Illuminate\Database\Query\Builder|Product withTrashed()
* @method static \Illuminate\Database\Query\Builder|Product withoutTrashed()
*/
class Product extends Model
{
use HasFactory, HasTranslations;
use HasFactory, HasTranslations, SoftDeletes;

public array $translatable = ['name', 'meta_title', 'meta_description', 'short_description', 'description'];

Expand All @@ -55,4 +63,9 @@ public function getRouteKeyName(): string
return 'slug';
}

public function inCategories(): HasManyThrough
{
return $this->hasManyThrough(Category::class, ProductCategory::class);
}

}
2 changes: 1 addition & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
"keywords": ["framework", "laravel"],
"license": "MIT",
"require": {
"php": "^8.0.2",
"php": "^8.1",
"anhskohbo/no-captcha": "^3.4",
"artesaos/seotools": "^0.23.0",
"guzzlehttp/guzzle": "^7.2",
Expand Down
45 changes: 45 additions & 0 deletions database/factories/ProductFactory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
<?php

namespace Database\Factories;

use App\Models\Category;
use App\Models\Product;
use App\Models\ProductCategory;
use Illuminate\Database\Eloquent\Factories\Factory;

/**
* @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Product>
*/
class ProductFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition()
{

return [
'meta_title' => ['en' => $this->faker->text(100), 'ru' => $this->faker->text(100)],
'meta_description' => ['en' => $this->faker->text(), 'ru' => $this->faker->text()],
'name' => ['en' => $this->faker->text(100), 'ru' => $this->faker->text(100)],
'slug' => $this->faker->slug,
'short_description' => $this->faker->text(200),
'description' => $this->faker->text(1000),
'price' => $this->faker->randomFloat(2),
'old_price' => $this->faker->randomFloat(2),
];

}

public function configure()
{
return $this->afterCreating(function (Product $product) {
$productCategory = new ProductCategory();
$productCategory->product()->associate($product);
$productCategory->category()->associate(Category::query()->whereNotNull('category_id')->get()->random());
$productCategory->save();
});
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ public function up()
Schema::create('products', function (Blueprint $table) {
$table->id();
$table->timestamps();
$table->softDeletes();

$table->json('name');
$table->json('meta_title');
Expand Down
Loading

0 comments on commit 34881f3

Please sign in to comment.