下单全过程2
商品表与sku 是一对多的关系
与商品的关系也是一对多的关系
商品属性表是与sku进行关联的
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(' - ');
}
}
然后我们进入工厂环节
商品属性表
对生产数据进行处理
数据迁移到此完成 但是这些地方其实可以忽略
商品列表与搜索?
<?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);
}
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
建议看一下这个包,packagist.org/packages/fsg-herbie/...