Tengo Modelos: ArtObjects y Fotos:
class Photo extends Model { protected $fillable = ['caption','description','alternative_text']; public function artObject() { return $this->belongsTo('App\ArtObject'); } } class ArtObject extends Model { /** * The attributes that are mass assignable. * * @var array */ protected $fillable = [ 'title', 'description', 'rating', 'popularity', 'type', 'price' ]; public function photos() { return $this->hasMany(ArtObjectPhoto::class); } }Controladores:
Controlador ArtObject:
public function store(ArtObjectUploadRequest $request) { $art_object = ArtObject::create(request(['title', 'description', 'rating', 'popularity', 'type', 'price'])); $this->validate($request, [ 'title' => 'required', 'description' => 'required' ]); foreach ($photo_ids = Input::get('photos') as $photo_id) { $photo = Photo::find($photo_id); /* Problem is here - The user wants to attach the selected photos with the art-object, ........ Please advise, thanks in anticipation !!! */ } //save the artobject to the database $art_object->save(); //And redirect to the home page return redirect('/'); }Problema: El usuario quiere adjuntar las fotos seleccionadas con el objeto de arte. Tenga en cuenta que las fotos ya existen en la base de datos. Probé opciones: guardar (), asociar (), pero nada ayudó. Entiendo que una vez que encuentre () la foto, debería darme un objeto Foto que debería poder guardar () con $ art_object. Quiere que haga new() y asigne desde DB y asigne al objeto Photo. Pero no creo que esta sea la forma correcta de hacerlo. Creo que esta no es la mejor manera de implementar la relación de muchos a, entonces, ¿cuál es la mejor manera de salvar esta relación? Por favor avise, gracias de antemano !!!
De acuerdo con la regla de relación de muchos a uno en la base de datos, la clave externa que conecta las tablas siempre se guarda en la tabla que tiene una relación de "muchos".
Como aquí, Un ArtObject puede tener muchas Fotos. Entonces, Esa tabla "Muchas" es Fotos. Su modelo de fotografía debe tener un atributo denominado art_object_id como clave externa.
Luego, primero debe guardar ese objeto ArtObject y guardar la identificación de este objeto en la tabla de fotos en todas aquellas filas cuya identificación es seleccionada por el usuario.
$art_object = ArtObject::create(request(['title', 'description', 'rating', 'popularity', 'type', 'price'])); $this->validate($request, [ 'title' => 'required', 'description' => 'required' ]); //save the artobject to the database $art_object->save(); foreach ($photo_ids = Input::get('photos') as $photo_id) { $photo = Photo::find($photo_id); $photo->art_object_id = $art_object->id; $photo->save(); }Después de hacer esto, puede obtener el ArtObject relacionado de una foto mediante el método que definió en el modelo de foto para relacionar ArtObject y las tablas de fotos. También puede obtener las fotos relacionadas con un ArtObject mediante el método definido en ArtObject.
En el modelo ArtObject: -
public function photos() { return $this->hasMany('App\Photo'); }En modelo de foto: -
public function artObject() { return $this->belongsTo('App\ArtObject'); }