Mostrar un único resultado en Laravel

Ya hemos visto cómo ver una lista de resultados, pero no como mostrar un único resultado en Laravel, que e sl oque vamos a ver en esta entrada.

La idea es que, siguiendo con nuestro tutorial, al hacer click sobre el título del mensaje, se muestre su contenido y su estatus.

Para ello, debemos de seguir los siguientes pasos:

Añadir una nueva ruta

Nos vamos a nuestro archivo de rutas y creamos una nueva.

Route::get('mensaje/{slug?}', 'MensajesController@show')->name('mensaje);

Vemos que esta ruta tiene una característica especial; {slug?} 

slug es un campo de la bbdd que corresponde a un uniqid() como ya vimos en la entrada de introducir datos por medio de un formulario en la bbdd.

de ese modo le estamos pasando un parámetro al enlace que es propio slug y que nos permite diferenciar el ticket.

Como siempre apuntamos a una acción dentro del controlador, en este caso a la acción show dentro de MensajesController.

Añadir la acción en el controlador

Una vez que tenemos hecha la ruta vamos al controlador app/Http/Controllers/MensajesController.php

Ahora modificamos el método show y dejamos así:

public function show($slug)
{
    $mensaje= Mensaje::whereSlug($slug)->firstOrFail();
    return view('mensajes.show', compact('mensaje'));
}

Aquí vemos que lo primero que se hace es pasarle a la acción show, el slug del mensaje.

A continuación usamos ese slug para encontrar el ticket que queremos ver, en este caso si fuera por nombre podríamos haber usado whereName($name)…

firstOrFail lo que hace es recuperar el primer resultado de la consulta y si no hay resultado lanza una excepción.

Finalmente lanzamos vista mensajes.show, donde se muestra el ticket.

Crear la vista

Ahora vamos a crear la vista en resources/views/mensajes/show.blade.php

A la cual le introducimos el siguiente contenido

@extends('layouts.app')
@section('title', 'Contact')
@section('content')
	<div class="container">
		<div class="well well bs-component">
			<h2>{!! $mensaje->title !!}</h2>
			<h4><strong>Status</strong>: {!! $mensaje->status ? 'Pendiente' : 'Respondido' !!}</h4>
			{!! $mensaje->contenido !!}
			<h4><a href="#" class="btn btn-info">Editar</a></h4>
			<h4><a href="#" class="btn btn-info">Borrar</a></h4>
		</div>
	</div>
@endsection

Aquí mostramos el título del mensaje, el estatus y añadimos dos botones para editar y borrar.

Crear el enlace el elemento

Para poder acceder al elemento tenemos que irnos a nuestro listado de mensajes resources/views/mensajes/index.blade.php y modificar la línea donde aparece el título del mensaje por esta otra:

<td><a href="{{ route('mensaje',$mensaje->slug)}}">{!! $mensaje->titulo !!}</a></td>

De este modo ya podemos hacer que los enlaces apunten directamente al mensaje que queremos y poder ya tener algo más de funcionalidad.

Como vemos es muy fácil mostrar un único resultado en Laravel, en las próximas entradas aprenderemos a editar y a borrar.