有两种型号:
Product
和Product_Images
class Product extends Eloquent {
protected $guarded = [];
public $timestamps = true;
public function images(){
return $this->hasMany('product_image');
}
public function brand(){
return $this->belongsTo('brand');
}
}
class Product_Image extends Eloquent {
protected $table = 'product_images';
protected $guarded = [];
public function images(){
return $this->hasMany('product_image');
}
}
我可以更新或插入数据到这个模型
$product = new Product;
$product->title = $data['title'];
$product->alias = $data['alias'];
$product->short_description = $data['short_description'];
$product->price = $data['price'];
$product->brand_id = $data['brand_id'];
$product->description = $data['description'];
$product->published = 1;
$product->save();
foreach($data['images'] as $k => $v){
if($data['main'] == $k){
$product->images()->save(
new Product_Image(['image' => $v,'main' => 1])
);
}else{
$product->images()->save(
new Product_Image(['image' => $v,'main' => 0])
);
}
}
但是当用户尝试编辑产品时,用户可能会删除现有的图像并尝试添加新的图像并发送表单。我应该怎么更新图像关系?我是否应该删除所有与产品相关的图像并创建新的图像?在我看来,这是一种糟糕的练习,有什么最好的方法吗?
首先你的关系是错误的,我认为你与产品和图像的关系是一对多
所以这里应该是
public function images(){
return $this->hasMany('product_image');
}
public function product()
{
return $this->belongsTo(Product::class);//import your product class with use
}
你也错误地定义了你的关系。在关系中,您可以选择定义类在某些情况下,您可以传递外键、本地键和表名,参见定义关系
应该是
public function images(){
return $this->hasMany('product_image');
}
public function brand(){
return $this->belongsTo('brand');
}
public function images(){
return $this->hasMany(Product_Image::class);//import class
}
public function brand(){
return $this->belongsTo(Brand::class);//import Brand class
}
也可以在这里简化代码
if($data['main'] == $k){
$product->images()->save(
new Product_Image(['image' => $v,'main' => 1])
);
}else{
$product->images()->save(
new Product_Image(['image' => $v,'main' => 0])
);
}
$product->images()->save(
new Product_Image(['image' => $v,'main' => (int)($data['main'] == $k)])
);