innoboxrr/traits
Traits
Model and value-object helpers, extracted from production Laravel work.
A small set of focused traits. Each one is independent — take only what you need.
| Trait | Purpose |
|---|---|
ArrayOperations |
isNotEmpty and wrapImplode for arrays |
DtoTrait |
A key/value data container with dot-notation access (get, set, has, only, except, merge, toJson…). setData() loads the class's own properties into it |
EnumTrait |
Helpers for backed enums: getValues(), getKeys(), getValue(), isValid(), isValidKey(), isValidKeyValue() |
MetaOperations |
Key/value metas in a <model>_metas table, plus a JSON payload copy |
ModelAppendsTrait |
Manage appended attributes without bloating the model |
DumpsGlobalScopes |
Inspect which global scopes are active on a query — a debugging aid |
SemVerOperations |
Parse, compare and bump semantic versions |
MetaOperations
Metas are extra fields that don't deserve a column: each one is a key/value row in the model's <model>_metas table. payload is a JSON column on the model that gathers them, so reading them costs no queries.
use Illuminate\Database\Eloquent\Relations\HasMany;
use Innoboxrr\Traits\MetaOperations;
class Article extends Model
{
use MetaOperations;
// What a form may write.
protected $editable_metas = ['seo_title', 'seo_description'];
// What only your code writes. Wins over $editable_metas.
protected $protected_metas = ['views'];
protected function casts(): array
{
return ['payload' => 'array'];
}
public function metas(): HasMany
{
return $this->hasMany(ArticleMeta::class);
}
public function buildPayload(): array
{
return $this->metas()->pluck('value', 'key')->all();
}
public function updatePayload(): bool
{
$this->payload = $this->buildPayload();
return $this->save();
}
}
The metas table needs key, value (text), the foreign key and a unique index on (key, <model>_id).
| Method | What it does |
|---|---|
update_metas($requestOrArray, Meta::class, 'article_id') |
The form path. Writes the keys in $editable_metas that are not in $protected_metas. An empty value (null, blank string, empty array) deletes the meta; a key that isn't sent is left alone. Arrays are stored as JSON. |
setMeta($key, $value) / setMetas([...]) |
The code path. No whitelist, so this is how protected metas are written. Arrays are stored as JSON; setMetas([]) does nothing. |
meta($key, $default) |
Reads one meta from the table, as stored: a JSON meta comes back as a string. |
getPayload('seo.title', $default) |
Reads the payload copy with dot notation. |
metas_array($requestOrArray) |
What update_metas would write. |
protectedMetas() |
The keys only the system writes. |
setMeta does not refresh payload: call updatePayload() after writing metas from code.
Console commands
metas:regpayload {modelClass} {--modelId=}— callsupdatePayload()on one model or all of them, and reports the ones that fail.meta:cleanup {models*}— removes duplicate(key, <model>_id)rows and adds the unique index. MySQL only.
Install
composer require innoboxrr/traits
php artisan vendor:publish --provider="Innoboxrr\Traits\Providers\AppServiceProvider" --tag=config
Full documentation of the ecosystem, in Spanish and English: https://innoboxrr.github.io/docs/paquetes/support-traits-search.
Part of Innobox R&R — 52 open-source packages extracted from production work. innobox.systems
Related Packages
Powerful PHP database abstraction layer (DBAL) with many features for database s...
Laravel Serializable Closure provides an easy and secure way to serialize closur...
Cli error handling for console/command-line PHP applications.
Version History
| Version | Released | PHP | Laravel | License |
|---|---|---|---|---|
| 2.1.0 | ^8.2 | ^12.0 | | MIT | |
| 2.0.3 | ^8.2 | ^12.0 | | MIT | |
| 2.0.2 | ^8.2 | ^12.0 | | MIT | |
| 2.0.1 | ^8.2 | ^12.0 | | MIT | |
| 2.0.0 | ^8.2 | ^12.0 | | MIT | |
| 1.6.12 | MIT | |||
| 1.6.11 | MIT | |||
| 1.6.10 | MIT | |||
| 1.6.9 | MIT | |||
| 1.6.8 | MIT | |||
| 1.6.7 | MIT | |||
| 1.6.6 | MIT | |||
| 1.6.5 | MIT | |||
| 1.6.4 | MIT | |||
| 1.6.3 | MIT | |||
| 1.6.2 | MIT | |||
| 1.6.1 | MIT | |||
| 1.6.0 | MIT | |||
| 1.5.1 | MIT | |||
| 1.5.0 | MIT | |||
| 1.4.2 | MIT | |||
| 1.4.1 | MIT | |||
| 1.3.1 | MIT | |||
| 1.3.0 | MIT | |||
| 1.2.1 | MIT | |||
| 1.2.0 | MIT | |||
| 1.1.0 | MIT | |||
| v1.0.0 | MIT |