【问题标题】:How to update Laravel relation's table如何更新 Laravel 关系表
【发布时间】:2015-09-03 09:49:21
【问题描述】:

有两种型号:

ProductProduct_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])
        );
    }
}

但是当用户尝试编辑产品时,用户可能会删除现有图像并尝试添加新图像并发送表单。我应该按照哪种方式更新图像关系。我应该删除与产品相关的所有图像并创建新图像吗?这对我来说似乎是不好的做法,有什么最好的吗?

【问题讨论】:

    标签: php laravel eloquent relationship


    【解决方案1】:

    首先你的关系是错误的,我认为你与产品和图像有一对多的关系

    应该是这样的

    public function images(){
        return $this->hasMany('product_image');
    }
    
    public function product()
    {
        return $this->belongsTo(Product::class);//import your product class with use
    }
    

    你也错误地定义了你的关系。在您的关系中,您可以选择定义类,在某些情况下您可以传递外键和本地键以及表名,请参阅Defining Relationships

    这应该是

    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)])
            );
    

    【讨论】:

    • 谢谢!我应用了您的更改,并从中学到了一些好处。我仍然不知道如何更新与产品相关的图像。我应该从表单中删除所有图像并添加新图像吗?
    猜你喜欢
    • 2018-06-02
    • 1970-01-01
    • 1970-01-01
    • 2017-05-17
    • 1970-01-01
    • 1970-01-01
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多