Buzz-Attributes
Pacchetto di buzz che permette di aggiungere programmaticamente campi ad un model, senza bisogno di migration. Utile quando non è possibile fare migration o quando i campi da aggiungere non sono ben definiti (cambiano dinamicamente).
Funzionamento
Gli attributi sono legati ai Model, utilizzando una relazione polimorfica.
La loro struttura a db è la seguente:
{
key: 'note',
value: 'Contenuto della nota',
attributable_type: 'App\User',
attributable_id: 1
}
Api pubbliche
Il model che utilizza gli attributes deve includere il trait Nodopiano\Buzz\Attributes\Traits\HasAttributes. Questo trait consente di interagire con gli attributes attraverso il Model.
Supponiamo di avere questa situazione:
user: App\User
campi aggiuntivi:
- 'note'
- 'codice_identificativo'
Le api pubbliche disponibili dal model App\User sono:
$user->attributes: ritorna una collection che include gli attributi aggiunivi organizzati come chiave-valore.App\User::filter($key, $value): ritorna una collection di utenti corrispondenti ai filtri richiesti.$user->getValueOf($key): ritorna il valore dell'attributo che corrisponde al parametro. Se non esiste, ritorna null.$user->saveAttribute($key, $value): salva l'attributo. Se esiste già la chiave, la aggiorna; altrimenti, la crea.$user->deleteAttribute($key): elimina l'attributo.
Salvataggio di massa
Per semplificare l'operazione di salvataggio ed eliminazione degli attributes in fase di update del model, il pacchetto mette a disposizione un repository Nodopiano\Buzz\Attributes\Repositories\AttributeRepository che mette a disposizione un metodo:
$repo->save($attributes, $model): ignora i campi già presenti nel model e salva quelli mancanti come attributes.
Funzionamento interno
Il model Attribute mette a disposizione una serie di local scope utili per filtrare i risultati. Utilizzo:
$attributes->select($key)->withValue($value)->of($attributable_type)->thatIs($attributable_id)
Filtri per $key:
select($key)
Filtri per $value:
withValue($value)withoutValue($value)withValueIn(array of $value)withValueNotIn(array of $value)
Filtri per $attributable_type:
of($type)
Filtri per $attributable_id:
thatIs($id)thatIsNot($id)thatIsIn(array of $id)thatIsNotIn(array of $id)
Esempi
$attributes->select('codice_identificativo')->withValueIn(['0001', '0002', '0003'])->of('App\User'): ottengo gli attributes di tipo codice identificativo legati ad utenti che contengono i valori ['0001', '0002', '0003'] (utile dentro un whereHas).$attributes->of('App\User')->thatIsIn([1,2,3]): ottengo gli attributes appartenenti agli utenti con id 1, 2 o 3.$attributes->of('App\User')->thatIsIn([1,2,3])->select('codice_identificativo'): ottengo i codici identificativi degli utenti 1, 2 e 3.