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.