2015-09-03 4 views
0

Есть 2 модели:Как обновить таблицу Laravel Relation в

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

но когда пользователи пытаются отредактируйте продукт, пользователи могут удалить существующие изображения и попытаться добавить новые и отправить форму. Каким образом я должен следить за обновлением отношений изображений. Должен ли я удалять все изображения, связанные с продуктом, и создавать новые? это выглядит плохой практикой для меня, есть ли что-нибудь лучше для этого?

ответ

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

Спасибо! я применил ваши изменения и узнал от него хорошую вещь. Тем не менее я не знаю, как обновлять изображения, связанные с продуктами. Должен ли я удалять все изображения и добавлять новые из формы? –

Смежные вопросы