Relaciones por defecto en Eloquent
Otra cosa molona de Eloquent es que nos permite definir modelos por defecto que se usarán cuando una relación no exista. Por ejemplo, supongamos la siguiente relación:
class Comment extends Model {
public function author()
{
return $this->belongsTo(User::class);
}
}
Si nuestra web permite que un visitante haga un comentario sin estar logueado, quiere decir que en nuestro código probablemente tendremos algo como esto:
@if ($comment->author)
<p>{{ $comment->author->name }}</p>
@else
<p>{{ __('Invitado') }}</p>
@endif
<!-- O algo así: -->
<p>{{ $comment->author?->name ?? __('Invitado') }}</p>
Sin embargo, hay una forma más chula que nos permite no estar comprobando en múltiples sitios si el autor existe o no:
class Comment extends Model {
public function author()
{
return $this->belongsTo(User::class)->withDefault([
'name' => 'Invitado',
]);
}
}
Al llamar a withDefault
, Eloquent creará un modelo en memoria (sin persistirlo en base de datos) con los atributos que enviemos por parámetro. De esta forma, nuestro código en Blade podría quedar así, ya que la relación nunca devolverá null:
<p>{{ $comment->author->name }}</p>