No es necesario comprobar si existen las relaciones en las vistas

Hace poco me encontré en las vistas de un proyecto Laravel en el que actualmente trabajo y en el que es necesario tener un código limpio, tengo muchos condicionales @if() de blade que me comprueban si existe un registro en el modelo relacionado.

Esto no es malo pero, hace que mis vistas se vean muy cargadas de código o de lógica que deberían ir en otro lado (controlador, modelo, etc.).

Supongamos que tengo un modelo Post:

 

public function author()
{
    return $this->belongsTo(App\Author::class);
}

 

Y en nuesta vista queremos mostrar por ejemplo, el nombre del autor, lo hacemos de la siguiente manera

{{ $post->author->name }}

 

Ahora qué pasa si un post no tiene un autor? si la propiedad post.author_id es NULL Laravel te mostrará este error “Trying to get property of non-object”, podrías usar la siguiente sintaxis

@if ($post->author)
  {{ $post->author->name }}
@else
  Sin Autor
@endif

O algo más sencillo

{{ $post->author->name or 'Sin Autor' }}

Pero hay una forma mejor y más limpia de realizar esto?

Claro que sí, las relaciones en Eloquent permiten definir un valor por defecto en caso de que el modelo devuelva un valor NULL

public function author()
{
    return $this->belongsTo(App\Author::class)->withDefault();
}

Aquí devolverá un objecto vacío del modelo Author si no existe un author relacionado al post.
Tambíen podemos colocar valores predeterminados de la siguiente manera

public function author()
{
    return $this->belongsTo(App\Author::class)->withDefault([
        'name' => 'Anónimo',
    ]);
}

Con esto ya no necesitamos comprobar en la vista si la relación es NULL o si existe, además nuestra vista queda un poco más limpia

{{ $post->author->name }}

Puedes encontrar más en la documentación Laravel Relationship