laravel 5.6 Eloquent optimizando consultas

Para ver las querys que se ejecutan en una vista

vamos al archivo de rutas

routes/web.php

y escribimos el sgt codigo


DB::listen(function ($query){
echo "<pre>{$query->sql}</pre>";
});

por ejemplo si vamos a la vista de usuarios
vemos que se
ejecuta 1 request para a la tabla de Users para traer a los usuarios
y 1 request a la tabla user_role por cada usuario para traer los nombres de sus roles.

osea que para mostrar un listado de 100 usuarios estariamos haciendo 100 consultas a la base de datos!


esto lo modificamos en el controller de USer
app\Http\Controllers\UsersController.php


y en  public function index()
    {
        $users = User::all();
        return view('users.index',compact('users'));
    }

CAmbiamos User::all() por

 $users = User::with('roles')->get();

y listo.

Ahora la vista solo ejecutara una unica llamada a la base de datos para mostrar
la lista de usuarios




laravel 5.6 HasMany

vamos a crear las relaciones de usuario con mensajes

un usuario puede enviar varios mensajes

un mensaje es enviado por un usuario

vamos a agregar el campo user_id en la tabla messages

desde la consola

php artisan make:migration add_user_to_messages --table=messages

vamos al archivo generado y editamos el up y el down

public function up()
    {
        Schema::table('messages', function (Blueprint $table) {
            //
            $table->integer('user_id')->nullable();
        });
    } 

 public function down()
    {
        Schema::table('messages', function (Blueprint $table) {
            //
            $table->dropColumn('user_id');
        });
    }


y ejecutamos la migration asi:

php artisan migrate

Vamos a la clase User y creemos la relacion con messages

creamos 

public function messages(){
        return $this->hasMany(Message::class);
}

y en la clase Message

creamos la relacion

public function user()
{
return $this->belongsTo(User::class);
}


Ahora en la pagina de creacion de mensaje, vamos a mostrar el campo name e email del formulario
solo para los casos en que se haya entrado sin loguearse
(si se esta logueado se envian estos campos como hiddens con los valores correspondientes al usuario logueado)

en el controller

modificamos la funcion store:

public function store(ContactoRequest $request)
    {
     
        $message = Message::create($request->all());

        if(auth()->check()){
            auth()->user()->messages()->save($message);
        }
        return redirect()->route('mensajes.create');
    }

entonces en /views/messages/index.blade.php

podemos mostrar el nombre y email del user logueado que envio el mensaje
asi:

@if($message->user_id)
<td> {{$message->user->name}}</td>
<td>{{$message->user->email}}</td>
@



si los mensajes pueden ser enviados por usuarios logueados, la funcion store del controller podria simplificarse de este modo

auth()->user()->messages()->create($request->all());



linux ubuntu mint actualizar chrome

 desde una terminal: $ sudo apt update $ sudo apt install google-chrome-stable