
Laravel 8.10.0
alberto • October 15, 2020
releaseLaravel raggiunge la versione 8.10.0. Analizziamo le principali novità.
Aggiunto il metodo upsert
nel Query Builder Standard e Eloquent
Il Query Builder guadagna finalmente un nuovo metodo utilissimo, upsert
che rappresenta una astrazione rispetto ai diversi grammar sottostanti.
Il funzionamento è semplice. Con questa operazione è possibile, tramite singola query, inserire o aggiornare i record nel database:
User::upsert([
['id' => 1, 'email' => 'taylor@example.com'],
['id' => 2, 'email' => 'dayle@example.com'],
], 'email');
In assenza di problemi di duplicazione i record vengono aggiornati, altrimenti verranno aggiornati i campi inseriti nell'array utilizzato come secondo parametro. Le colonne created_at
ed updated_at
vengono correttamente gestite dal framework se esistenti.
Il metodo upsert viene concretizzato secondo queste sintassi proprietarie:
- su MySQL viene utilizzata la clausola
on duplicate key update
- su PostgreSQL e su SQlite viene utilizzata la clausola
on conflict do update set
- su SQL Server viene utilizzata la clausola
when not matched then insert
Per i piú curiosi, su Laravello è presente un [approfondimento]({% post_url 2020-10-05-insert-on-duplicate-key-update %}) su questo argomento nell'ambito MySQL.
A questo link è possibile visionare la PR originale.
Nuovo metodo dropColumns
nello Schema Builder
Nuovo metodo di syntactic sugar all'interno delle nostre migrations. Grazie a dropColumns
è possibile eliminare più colonne in un unico comando, senza dover per forza utilizzare una closure.
Ecco un esempio:
public function down()
{
Schema::dropColumns('posts', ['user_id', 'state']);
}
A questo link è possibile visionare la PR originale.
Migliorata la schedulazione annuale con yearlyOn
Aggiunta una nuova possibilità di schedulazione. Con yearlyOn
possiamo definire mese, giorno e orario per una operazione da eseguire annualmente.
$schedule->yearlyOn(7, 10, '10:05');
In questo caso, il nostro comando verrà invocato ogni 10 luglio alle ore 10:05.
A questo link è possibile visionare la PR originale.
Nuova regola di validazione multiple_of
Anche il validatore di Laravel si arricchisce di una nuova funzionalità. Grazie alla rule multiple_of
possiamo imporre che un numero sia multiplo di un secondo numero.
[
'age' => 'multiple_of:5'
]
In questo esempio una age di 10 anni sarebbe considerata valida, mentre una di 12 genererebbe un errore.
A questo link è possibile visionare la PR originale.
Aggiunto i metodi is
e isNot
nelle relazioni 1 a 1
Le relazioni singolari di Eloquent hanno guadagnato due metodi che permettono il confronto verso un altro modello senza effettuare extra query.
Ecco un esempio chiarificatore:
public function isTheAuthor(User $user, Post $post)
{
// Controllo manuale, serve conoscere e duplicare la foreignKey e la primaryKey
return $post->author_id === $user->id;
// Metodo `is` all'interno di Model, obbliga ad effettuare una query di fatto inutile
return $post->author->is($user);
// Grazie a questa nuova feature possiamo verificare l'uguaglianza in maniera agile
return $post->author()->is($user);
}
A questo link è possibile visionare la PR originale.
Possibilità di aggiungere chain di Jobs ai Batch
Grazie a questa nuova feature è possibile aggregare in maniera elegante Chain di job all'interno di un Batch:
$batch = Bus::batch([
new Test1Job(),
[
new Test2Job(),
new Test3Job(),
new Test4Job(),
]
])->then(function (Batch $batch) {
Log::info('Test Complete!');
})->name('Test')->dispatch();
La novità non è di facile comprensione per chi non conosce bene questo modulo di Laravel. Suggeriamo di dare un'occhiata alla documentazione linkata per approfondimenti.
A questo link è possibile visionare la PR originale.
Metodo canAny
alla classe User
Nuova possibilità di syntactic sugar all'interno della trait Authorizable
.
Al posto di:
$user->can('permission-one') || $user->can('permission-two');
possiamo ora scrivere:
$user->canAny(['permission-one', 'permission-two']);
A questo link è possibile visionare la PR originale.
Altre novità
Per le altre novità di questo ricco e interessante rilascio, rimando al changelog ufficiale.