下单全过程2

下单全过程2

下单全过程2

下单全过程2

下单全过程2

商品表与sku 是一对多的关系
下单全过程2

与商品的关系也是一对多的关系
下单全过程2

下单全过程2

商品属性表是与sku进行关联的
下单全过程2

下单全过程2

下单全过程2

下单全过程2

下单全过程2

下单全过程2

下单全过程2


class Category extends Model
{
    use HasFactory;

    protected $fillable = [
        'title','parent_id','is_directory','level','path'
    ];

    protected $dates = [
        'is_directory' => 'boolean'
    ];

    protected static function boot()
    {
        parent::boot();
        // 监听 Category 的创建事件,用于初始化 path 和 level 字段值
        static::creating(function (Category $category) {
            // 如果创建的是一个根类目
            if (is_null($category->parent_id)) {
                // 将层级设为 0
                $category->level = 0;
                // 将 path 设为 -
                $category->path  = '-';
            } else {
                // 将层级设为父类目的层级 + 1
                $category->level = $category->parent->level + 1;
                // 将 path 值设为父类目的 path 追加父类目 ID 以及最后跟上一个 - 分隔符
                $category->path  = $category->parent->path.$category->parent_id.'-';
            }
        });
    }

    public function parent()
    {
        //父类与子类是一对多的关系
        return $this->belongsTo(Category::class);
    }

    public function children()
    {
        //一对多的关系
        return $this->hasMany(Category::class,'parent_id');
    }

    public function products()
    {
        return $this->hasMany(Product::class);
    }

    public function getPathIdsAttribute()
    {
        return array_filter(explode('-',trim($this->path,'-')));
    }

    public function getAncestorsAttribute()
    {
        return Category::query()
            ->where('id',$this->path_ids)
            ->orderBy('level')
            ->get();
    }

    public function getFullNameAttribute()
    {
        return $this->ancestors
            ->pluck('name')
            ->push($this->name)
            ->implode(' - ');
    }
}

下单全过程2

然后我们进入工厂环节

下单全过程2

商品属性表

下单全过程2

下单全过程2

下单全过程2

下单全过程2

对生产数据进行处理

下单全过程2

下单全过程2

下单全过程2
数据迁移到此完成 但是这些地方其实可以忽略

商品列表与搜索?

下单全过程2

下单全过程2

下单全过程2

下单全过程2

下单全过程2

下单全过程2

<?php
namespace App\Services\Index;

use App\Contracts\Index\SearchContracts;
use App\Models\Product;

class SearchService implements SearchContracts
{
    /**
     * @var 模型构造器 => 主要是用于构造查询商品的条件
     */
    protected $builder;

    public function __construct()
    {
        $this->builder = Product::query()->where('on_sale',true);
    }

    public function orderBy($oder)
    {
        if (preg_match('/^(.+)_(asc|desc)$/',$oder,$m)){
            if (in_array($m[1],['price','sold_count','rating'])){
                $this->builder->orderBy($m[1],$m[2]);
            }
        }

        return $this;
    }

    public function LikeProduct($search)
    {
        $like = '%'.$search.'%';

        $this->builder->where(function ($query) use ($like){
            $query->where('title','like',$like)
                ->orWhereHas('description',function ($query) use ($like){
                    $query->orWhere('description','like',$like);
                })->orWhereHas('sku',function ($query) use ($like){
                    $query->orWhere('title','like',$like);
                });
        });

        return $this;
    }

    public function category($category)
    {
        // TODO: Implement category() method.
    }

    public function getProduct()
    {
        return $this->builder->paginate(15);
    }
}

下单全过程2

下单全过程2

下单全过程2

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 1

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!