jueves, 26 de noviembre de 2015

15 - Tutorial de Laravel 5 - CRUD Create & Read (Sistema de comentarios)




En este capítulo del Tutorial de Laravel 5 crearemos una nueva tabla llamada "comments", sobre esta tabla veremos como realizar diferentes tipos de consultas tales como la creación, lectura, actualización y eliminación de registros.

El ejemplo consiste en permitir a los usuarios autenticados publicar comentarios desde la página de inicio, a modo de mural y mostrar los comentarios publicados en el mismo.

Lo primero que haremos es crear la clase que nos permita realizar la migración a través de artisan, para ello abriremos una consola nos dirigiremos al interior de la raiz de nuestro proyecto Laravel, donde se encuentra el archivo "artisan" y ejecutamos el siguiente comando ...

php artisan make:migration create_comments_table --create=comments


A continuación incluiremos una serie de columnas a la table "comments", así que nos dirigimos a la carpeta "database\migrations" y abrimos el archivo "xxx_create_comments_table.php", código para este archivo:

<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateCommentsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('comments', function (Blueprint $table) {
            $table->increments('id');
            $table->text('comment');
            $table->integer('id_user');
            $table->date('date');
            $table->time('time');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('comments');
    }
}



A continuación regresamos a la consola y realizamos la migración de la nueva tabla con el siguiente comando:

php artisan migrate


Ahora podéis revisar en vuestra base de datos para ver que la tabla "comments" ha sido creada con éxito.

A continuación crearemos una clase que nos permita conectar la tabla "comments" al driver eloquent, al igual que ocurre con la clase User, así que nos dirigimos a la carpeta "app" y creamos un nuevos archivo con el siguiente nombre Comments.php y con el siguiente código:

<?php
namespace App;

use Illuminate\Database\Eloquent\Model;

class Comments extends Model
{
    protected $table = 'comments';	
}


Lo siguiente es realizar una serie de modificaciones en la vista "home", el código completo de la vista es el siguiente:

@extends('layouts.home')

@section('content')
<h1>Bienvenid@s a la aplicación Laravel</h1>
<hr />
@if (Session::has('status'))
	<div class="bg-success" style="padding: 20px;">
		{{Session::get('status')}}
	</div>
	<hr />
@endif
@if (Auth::check())
	<form method="post" action="{{url('user/createcomment')}}">
		{{csrf_field()}}
		<div class="form-group">
			<div class="row">
				<div class="col-md-1">
					<img src="{{url(Auth::user()->perfiles)}}" class='img-responsive' style='max-width: 60px' />
					<strong>{{Auth::user()->name}}</strong>
				</div>
				<div class="col-md-6">
					<textarea name="comment" class="form-control"></textarea>
					<br />
					<button type="submit" class="btn btn-primary">Publicar</button>
				</div>
			</div>
		</div>
	</form>
	<hr />
        <?php 
        $comments = App\Comments::select()->orderBy('id', 'desc')->get();
        foreach($comments as $comment):
            $user = App\User::select()->where('id', '=', $comment->id_user)->first();
        ?>
        <div class="row">
            <div class="col-md-1">
                <img src='{{url($user->perfiles)}}' class='img-responsive' style='max-width: 60px' />
                <strong>{{$user->name}}</strong>
            </div>
            <div class='col-md-6'>
               {{$comment->comment}} 
               <br />
               <i>Fecha: {{$comment->date}} · Hora: {{$comment->time}}</i>
            </div>
        </div>
        <hr />
        <?php endforeach ?>
@else
	<hr />
	<p class="bg-info" style="padding: 20px;">Para poder publicar comentarios tienes que <a href="{{url('auth/login')}}">iniciar sesión</a></div>
	<hr />
@endif
@stop


En la vista podemos ver un mensaje flash "status" que mostrará un mensaje al usuario cuando el comentario se haya publicado con éxito, luego podemos ver como se comprueba si el usuario está autenticado, si lo está se carga el formulario para publicar comentarios con cierta información de usuario como la imagen de perfil y nombre, también se muestra como se realiza la consulta de selección de comentarios. De lo contrario, es decir, si el usuario no está autenticado, se muestra un mensaje indicando al usuario que debe iniciar sesión para poder publicar comentarios.

Lo siguiente es crear la acción createComment en el controlador UserController, esta acción será la encargada de insertar el registro en la tabla "comments", pero previamente agregaremos la clase "App\Comments" al controlador ...

use App\Comments;


Código de createComment ...

    public function createComment(Request $request){
        $comment = e($request->comment);
        $date = date('Y-m-d');
        $time = date('H:m:s');
        Comments::insert([
            'comment' => $comment,
            'id_user' => Auth::user()->id,
            'date' => $date,
            'time' => $time,
        ]);
        return redirect('home')->with('status', 'Enhorabuena comentario publicado con éxito');
    }


Y agregamos la nueva ruta en routes.php para conectarla a la acción ...

Route::post('user/createcomment', 'UserController@createComment');


Finalmente realizamos la prueba para publicar comentarios y ver como los comentarios creados son mostrados en el muro.