larave 商品表设计
2018年9月4日1.商品表设计,一个商品可以有多个种类
2.模型关联
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Product extends Model { /** * 允许填写的字段 * @var array */ protected $fillable = ['title', 'description', 'image', 'on_sale', 'rating', 'sold_count', 'review_count', 'price']; /** * on_sale 是一个布尔类型的字段暂时没有搞明白 * @var array */ protected $casts = [ 'on_sale' => 'boolean', ]; /** * 与商品SKU关联 正向一对多 * @return \Illuminate\Database\Eloquent\Relations\HasMany */ public function skus() { return $this->hasMany(ProductSku::class); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class ProductSku extends Model { /** * 需要填写的字段 * @var array */ protected $fillable = ['title', 'description', 'price', 'stock']; /** * 反向一对一 * @return \Illuminate\Database\Eloquent\Relations\BelongsTo */ public function product() { return $this->belongsTo(Product::class); } } |
3.laravel-admin 创建数据写发
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
<?php namespace App\Admin\Controllers; use App\Models\Product; use Encore\Admin\Form; use Encore\Admin\Grid; use Encore\Admin\Facades\Admin; use Encore\Admin\Layout\Content; use App\Http\Controllers\Controller; use Encore\Admin\Controllers\ModelForm; class ProductsController extends Controller { use ModelForm; /** * Index interface. * * @return Content */ public function index() { return Admin::content(function (Content $content) { $content->header('商品列表'); $content->body($this->grid()); }); } /** * Edit interface. * * @param $id * @return Content */ public function edit($id) { return Admin::content(function (Content $content) use ($id) { $content->header('编辑商品'); $content->body($this->form()->edit($id)); }); } /** * Create interface. * * @return Content */ public function create() { return Admin::content(function (Content $content) { $content->header('创建商品'); $content->body($this->form()); }); } /** * Make a grid builder. * * @return Grid */ protected function grid() { return Admin::grid(Product::class, function (Grid $grid) { $grid->id('ID')->sortable(); $grid->title('商品名称'); $grid->on_sale('已上架')->display(function ($value) {return $value ? '是' : '否';}); $grid->price('价格'); $grid->rating('评分'); $grid->sold_count('销量'); $grid->review_count('评论数'); $grid->actions(function ($actions) { #$actions->disableView(); $actions->disableDelete(); }); $grid->tools(function ($tools) { #批量操作工具 $tools->batch(function ($batch) { #禁用批量操作按钮 $batch->disableDelete(); }); }); }); } /** * Make a form builder. * * @return Form */ protected function form() { return Admin::form(Product::class, function (Form $form) { $form->text('title', '商品名称') ->rules('required'); $form->image('image', '封面图片') ->rules('required|image'); $form->editor('description', '商品描述')->rules('required'); $form->radio('on_sale', '上架') ->options(['1' => '是', '0'=> '否'])->default('0'); /** * 一对多关联创建数据 */ $form->hasMany('skus', 'SKU 列表', function (Form\NestedForm $form) { $form->text('title', 'SKU 名称') ->rules('required'); $form->text('description', 'SKU 描述')->rules('required'); $form->text('price', '单价') ->rules('required|numeric|min:0.01'); $form->text('stock', '剩余库存') ->rules('required|integer|min:0'); }); /** * 定义事件回调,当模型即将保存时会提前触发这个回调,其实到这里数据已经开始添加了,但是我们要将最低价,放进来所有使用这个方法 */ $form->saving(function (Form $form) { $form->model()->price = collect($form->input('skus'))->where(Form::REMOVE_FLAG_NAME, 0)->min('price') ?: 0; }); }); } } |