Laravel 8.10.0 cover image

Laravel 8.10.0

alberto • October 15, 2020

release

Laravel 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:

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.