Utiliza relaciones HasMany existentes como HasOne en Laravel

Spread the love

En Laravel, la relación HasMany te ayuda a definir una relación uno-a-muchos entre dos modelos. Por lo cual, si tienes un modelo User y un modelo Post, puedes definir una relación HasMany entre ellos de la siguiente forma.

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
use App\Models\Post;

class User extends Model
{
    public function posts(): HasMany
    {
        return $this->hasMany(Post::class);
    }
}

Hasta aquí todo bien.

Ahora. Si quieres establecer una relación uno a uno entre los modelos User y Post, puedes usar la relación HasOne. Así puedes definir una relación entre los dos modelos y para recuperar el post más popular de un usuario usaríamos el método ofMany().

public function popularPost(): HasOne
{
    return $this->hasOne(Post::class)->ofMany('votes', 'max');
}

Nuevo método one()

Pero en la última versión de Laravel…

Ahora puedes convertir una relación HasMany existente en una relación HasOne utilizando el nuevo método one() junto con la relación HasMany.

Así, si utilizamos la relación HasMany que definimos al principio del artículo, podemos convertirla en una relación HasOne de la siguiente manera.

public function popularPost(): HasOne
{
    return $this->posts()->one()->ofMany('votes', 'max');
}

Como puedes ver, la ventaja de utilizar el método one() es reutilizar sin problema la misma relación HasMany que definimos previamente al inicio de este artículo.