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';