场景:创建产品信息,图片会单独存储到good_image表中,其他数据存储到产品表中
1、处理数据前提准备
good 产品表,good_image 产品图片表
生成GoodController,
2、GoodController,from方法接收数据
protected function form()
{
$form = new Form(new Good());
$form->text('good_name', __('产品名称'));
$form->select ('brand_id', '品牌')->options (Brand::all()->pluck('brand_name','id'));
$form->select('cate_id','分类')->options(
Category::all()->pluck('category_name','id')
);
$form->image('cover',__('封面图'))
->thumbnail('small', $width = 300, $height = 300)->removable();
$form->decimal('price', __('售价'));
$form->decimal('original', __('原价'));
$form->number('is_sale', __('是否上架'))->default(1);
$form->text('tags', '标签');
$form->textarea('content', __('产品内容'));
$form->textarea('summary', __('产品简介'));
return $form;
}
}
这里可以看到cover封面字段,这个是我单独存储到good_image表中的字段,但是good表是没有这个字段的,先接收一下数据。
3、Good模型处理
class Good extends Model
{
public $table = 'good';
public static function boot(){
// 继承父类
parent::boot();
// updating creating saving 这几个方法你自己选择,打印一下$model看看你就知道怎么取出数据了
static::saving(function ($model) {
$nId = app(Snowflake::class)->nextId();
$model->id= $nId ;
//组装图片信息
$arrImage = [
'id' => app(Snowflake::class)->nextId(),
'good_id' => $nId,
'position' => 1,
'link' => $model->cover
];
$bRet = GoodImage::create($arrImage);
if ( !$bRet )
{
return false;
}
unset($model->cover);
});
}
public function goodImage()
{
return $this->hasMany(GoodImage::class);
}
}
这里在boot方法里面,组装了image的数据,单独处理,并存入good_image中,然后最后一定要删除cover字段,因为good里面是没有这个对象的,如果不销毁,会报错。这样就完成了。
这里说一下,这个办法我是没有办法中的办法,我读了一遍文档没有看到有专门讲如何一对多存储的,也有可能是我没看懂,所以没办法我只能用笨的办法先完成它,肯定有人会说多表处理数据,没有事务处理,这里我也是查了一下,没找到怎么在这个对象中进行事务,那只能在前面数据尽量先处理好传过来的参数,给表单加一些验证和约束。尽量保证数据的完整性,这里如果有哪位大哥,找到很好的办法,希望你可以私信一下我,我也学习一下。谢谢