Qué es un modelo pivote personalizado
La tabla intermedia de belongsToMany (muchos a muchos) se trata por defecto como una instancia sencilla deIlluminate\Database\Eloquent\Relations\Pivot. Si quieres añadir columnas adicionales a la tabla intermedia (fecha de aprobación, tipo de rol, etc.) o incluir accessors, mutators o métodos propios, crea un modelo personalizado que herede de Pivot.
belongsToMany, llama a using() para indicarle a la relación que utilice este modelo personalizado.
Al nombrar un modelo pivote personalizado, sigue la convención de usar los nombres en singular y por orden alfabético (
RoleUser, no UserRole). Esto es una convención de nombrado; el nombre real de la clase lo eliges libremente.Especificar los atributos a obtener con as()
Por defecto se accede a los valores de la tabla intermedia mediante la propiedad pivot. Con el método as() puedes cambiar ese nombre.
Columnas adicionales y timestamps
Si la tabla intermedia tiene columnas adicionales comoapproved, indícalas explícitamente con withPivot() para que se incluyan en el resultado. Si quieres gestionar created_at / updated_at, llama a withTimestamps().
Referencia inversa desde el modelo pivote
En un modelo pivote personalizado puedes definir libremente relacionesbelongsTo hacia el modelo declarante y el modelo relacionado.
$roleUser->role o $roleUser->user. Ahora bien, si quieres que estas relaciones se cargen automáticamente (Eager loading) al ejecutar la consulta padre, puedes usar el método chaperone() descrito a continuación.
Eager loading automático con chaperone() (Laravel 13)
En Laravel 13 se ha añadido el método chaperone(), que hidrata automáticamente (equivalente al eager loading) las relaciones belongsTo como role() / user() definidas en el modelo pivote cuando se ejecuta la consulta de belongsToMany.
chaperone(), Eloquent infiere automáticamente el nombre de las relaciones belongsTo del modelo pivote (RoleUser) y, al obtener una colección como Role::with('users'), asigna las referencias al modelo declarante y al relacionado sin lanzar consultas adicionales.
Cuando los nombres de relación no son estándar
Si el nombre del métodobelongsTo en el modelo pivote no sigue la convención estándar (nombre del modelo declarante o relacionado en camelCase singular), indícalo explícitamente en los argumentos de chaperone().
Próximos pasos
Relaciones
Vuelve a repasar cómo definir las relaciones básicas, incluida belongsToMany.
Observers de Eloquent y eventos del modelo
Aprende a enganchar el guardado y la actualización del modelo pivote mediante eventos del modelo.