21 Creare un record

Vediamo come aggiungere un abum, prima di tutto aggiungiamo la voce nel menu nel nostro template default mappando la rotta col suo nome e il metodo route(‘albums.create’)

<li class="nav-item">
 <a class="nav-link" href="{{route('albums.create')}}" >New Album</a>
</li>

Creiamo la rotta col suo nome

Route::get('/albums/create', 'AlbumsController@create')->name('album.create');

Creiamo il metodo create() nel controller che restituirà la view per un nuovo album

public function create()
{
 return view('albums.createalbum');
}

Per la view createalbum copiamo il codice della view editalbum per partire da quello visto che è simile

@extends('templates.default')
@section('content')
<h1>Edit Album</h1>

<form action="{{route('albums.update',['album' => $album->id])}}" method="POST">
@csrf
@method('PATCH')
 <input type="hidden" name="_method" value="PATCH">
 <div class="form-group">
  <label for="">Name</label>
  <input type="text" name="name" id="name" class="form-control" value="{{$album->album_name}}" placeholder="Album name">

 </div>
 <div class="form-group">
  <label for="">Description</label>
  <textarea name="description" id="description" class="form-control" placeholder="Album description">{{$album->description}}</textarea>

 </div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
@stop

quello che ci interessa è modificare la rotta nell’ action del form che tramite la richiesta POST indica che andremo a creare una risorsa nell’ url specificato

<form action="{{route('albums.save')}}" method="POST">

eliminiamo il campo input hidden, il value di default di name e description.

Creiamo il metodo save() che sarà la funzione che salverà l’album, per ora verifichiamo stampando i dati passati dalla request()

public function save() {
 dd(request()->all());
}

Creiamo la rotta POST che richiamerà il metodo save() e la chiamiamo album.save

Route::post('/albums', 'AlbumsController@save')->name('album.save');

ora nel form indichiamo la rotta albums.save come abbiamo fatto per l’update

<form action="{{route('albums.save')}}" method="POST">

Verificando ora il giro cliccando si New Album, vediamo che all’url /albums/create non trova il metodo show(). Effettivamente la rotta

Route::get('/albums/{id}', 'AlbumsController@show']);

sovrascrive la rotta save. Possiamo risolvere utilizzando il metodo where() a cui passiamo l’id e con un’ espressione regolare diciamo che deve essere di tipo numerico.

Route::get('/albums/{id}', 'AlbumsController@show'])->where('id', '[0-9]+');

a questo punto questa rotta verrà ignorata aprendo /albums/create e verrà lanciato il metodo save() che mi restituirà i dati della richiesta.

Completiamo il metodo save() utilizzando request()->only() e passando un array con i dati interessati

public function save() {
 $data = request()->only(['name','description']);
}

all’album avevamo associato anche l’ utente, che al momento non stiamo gestendo, andiamo ad inserire manualmente un user_id = 1 nell’ array

$data['user_id'] = 1;

prepariamo la query SQL di tipo INSERT

$sql = 'INSERT INTO albums (album, description, user_id)';
$sql .= ''VALUES(:name,:description,:user_id)';

usiamo il metodo DB::insert()

$res = DB::insert($sql, $data);

aggiungiamo il messaggio condizionale come fatto prima con session()->flash() ed il reindirizzamento

$messaggio = $res ? 'Album ' . $data['name'] . ' creato' : 'Album ' . $data['name'] . ' Non creato';
session()->flash('messaggio', $messaggio);
return redirect()->route()'albums';

ora inserendo un nuovo album, tutto funziona regolarmente, l’album creato lo vediamo in fondo, quindi cambiamo l’ordinamento nel metodo index() con ORDER BY

$sql .= ' ORDER BY album_name';

oppure per id decrescente con DESC

$sql .= ' ORDER BY id DESC';