Relaciones polimórficas uno a uno (one to one)

Por ejemplo una table de images que guardará imágenes de users, posts, videos, etc, por lo que hay que indicar tanto el id al que se refiere como al modelo al que se refiere.

php artisan make:model Image -m
Hay que RESPETAR siempre la nomenclatura y los nombres del id y del type serán siempre el nombre del modelo+able_id y nombre del modelo+able_type

Por tanto en esa migration:
Schema::create('images', function (Blueprint $table) {
   $table->string('url');
   $table->unsignedBigInteger('imageable_id');
   $table->string('imageable_type');
   // crear una clave primaria compuesta (es relacion 1 a 1, no puede haber repetidos)
   $table->primary(['imageable_id', 'imageable_type']);
   $table->timestamps();
});

php artisan migrate
En app\Models\Image.php:
// ponerlo vacío el guardes para así poder meter masivamente desde tinker
protected $guarded = [];

public function imageable() {
   return $this->morphTo();
}

En app\Models\User.php:
// relación uno a uno polimórfica
public function image() {
   return $this->morphOne('App\Models\Image','imageable');
}

Abrir tinker para hacer pruebas:
php artisan tinker
use App\Models\Image;
Image::create(['url' => 'url 1','imageable_id' => 1, 'imageable_type' => 'App\Models\User']);
use App\Models\User;
$user = User::find(1);
// para acceder a la imagen de ese usuario
$user->image;
// add directamente a ese user una url
$user->image()->create(['url' => 'url edc']);

No hay comentarios:

Publicar un comentario