wamadev/nova-parental-field
wamadev/nova-parental-field provides a Laravel Nova field for selecting a parent record, making it easy to manage hierarchical or self-referencing relationships directly from Nova forms. Simple to install and configure, it helps organize nested content and tree-like data without custom UI code.
Scope note: This is not a general-purpose Laravel package. It is a Laravel Nova field — a UI extension for a paid, closed-source, first-party admin panel. That single fact drives most of the risk below: the field's runtime contract is with Nova's internal field API and Vue component conventions, not with a stable public Laravel contract. Nova majors (3 → 4 → 5) have historically required field rewrites, and this field's last release was 2021-07-08, which places it squarely in the Nova 3 era.
Architecture fit
The package occupies a narrow, well-defined slot: it renders a select control on a Nova form for a model that points at itself via a parent foreign key (categories, pages, org units, menus). It is a presentation-layer convenience, not a domain module. Assess fit on four points:
wamadev/parental) supplies the self-referential trait/relationship and this field is only the form control. A TPM must establish whether the valuable logic lives upstream in a package we are also implicitly adopting, or whether the field is self-contained. If the field hard-depends on the trait, our real dependency footprint is two packages, one of which we have not assessed.BelongsTo field that can be pointed at the same resource to express a self-referential relation. The build-vs-adopt delta is therefore small — likely searchability, depth indentation, or cycle filtering. If the package's only differentiator is a <select> populated from a table, our own ~100-line field matches it in an afternoon.nova.mix, component registration, Vue 2 vs 3). This is a materially larger maintenance surface than a backend-only package, and it is the part most likely to break on a Nova upgrade.fields() method. That is a genuine mitigating factor: blast radius on removal is one line per resource.Integration feasibility
Install is trivial (Composer + Nova field registration in a resource). The real work is compatibility proof, and the timeline makes that doubtful:
| Dimension | Likely state | Why it matters |
|---|---|---|
| Nova version support | Unverified; probably Nova 3.x only | Nova 4 moved to Vue 3 and changed field scaffolding; Nova 5 raised PHP/Laravel floors. A 2021 field almost certainly does not render on Nova 5 without a patch. |
| PHP / Laravel bounds | Unverified | If constraints are open-ended, Composer will happily install it onto an unsupported platform and fail at runtime instead of at resolve time. |
| Companion dependency | Unknown | wamadev/parental version pin governs most of the actual behaviour. |
| Test / CI signal | Unknown | No evidence of a suite; a broken select is a silent, not loud, failure. |
| Maintainer / bus factor | Unknown, likely single | 5 stars, no release since 2021 ⇒ effectively unmaintained. |
Technical risk
record.parent_id = record.id, or A→B→A, corrupts tree data and can hang any recursive renderer downstream. Validate this explicitly in the spike.pluck() the entire table? An unscoped list leaks record names across tenants/roles and is a reportable defect, not a UI nit.<select> populated with every row is unusable and memory-hostile past a few thousand records. Confirm whether it uses Nova's searchable/async BelongsTo machinery or a flat option array.Key questions (blocking — hours to answer, quarters of rework if skipped)
wamadev/parental a hard dependency, and if so what does it own — trait, relationship, cycle guard?pluck()?BelongsTo in self-referential mode, (b) a first-party field we write in 1–2 days?Stack fit
Evaluate against our pinned Nova major and Laravel/PHP versions, not latest. Nova is the binding constraint, not Laravel — a field can be perfectly Laravel-compatible and still be dead on the Nova side. Install into a throwaway Nova install on our exact versions, register against a real hierarchical model, and exercise create/edit/update.
Migration path
Greenfield adoption — no incumbent, so this is an evaluation, not a migration. Sequence:
parent_id, respects policies, blocks trivial cycles (or documents that it doesn't), behaves at realistic row counts.^ on an unmaintained package.Compatibility
Pin exactly and treat Nova-major upgrades as a joint ticket with this package's status. If the package cannot run on our target Nova version, stop — do not fork-to-upgrade unless the build path was already rejected, because forking a Vue field is a real cost with no strategic payoff. Add a Renovate/Dependabot rule that surfaces upstream releases but never auto-merges.
Sequencing
Spike → build-vs-adopt decision (explicit, written) → wrapper → single-resource canary → broad rollout. Do not schedule the broad rollout before the Nova upgrade roadmap is known; those two decisions must be made together.
Maintenance
Budget on the assumption we own this code. Realistic ongoing cost is low in absolute terms (a handful of hours per Nova major, a couple of hours per year for review) but non-zero forever, and it lands on whoever owns the admin panel at upgrade time. If the field also pulls in wamadev/parental, that package's maintenance profile — trait, migrations, relationship behaviour — is the bigger, less visible line item.
Support
No maintainer SLA, no changelog, effectively no upstream. Escalation path is internal: the wrapper's documented behaviour and our own tests. That is acceptable for an internal admin widget and unacceptable for anything customer-facing or compliance-relevant.
Scaling
Three axes to test, not assume:
resolve/relatable calls run per form render; confirm no N+1 on index views.Failure modes
| Mode | Impact | Mitigation |
|---|---|---|
| Silent blank render after Nova upgrade | Admins lose the ability to set parent; data drifts to "no parent" | Pin Nova + field together; smoke-test admin forms in the upgrade checklist |
Cycle accepted (self or descendant) |
Corrupt tree, hung renderers, bad SEO/nav output | Server-side validation we own; do not rely on the field |
| Unscoped option list | Cross-tenant/role record-name disclosure | Verify against Nova policies; scope the query ourselves if not |
| Unusable select at scale | Admin cannot find the right parent; support tickets | Prefer searchable/async control; fall back to our own field |
| Upstream abandonment vs. future Nova | Package becomes the reason we cannot upgrade | Wrapper + one-line removal path; revisit at each Nova major |
Ramp-up
Low for anyone fluent in Nova fields — registration and Composer are well-trodden. The non-obvious cost is judgment under thin evidence: engineers must treat a 4-year-stale, 5-star field as untrusted, route all usage through our own field class, and push cycle-prevention and authorization into our domain layer rather than the widget. Put that in the ticket, or it will drift into direct dependency on the vendor's class.
Recommendation — Leverage it only as a spike, then most likely build. The package's entire value proposition is a parent select on a Nova form, which is a 1–2 day build against Nova's existing BelongsTo machinery — and the build gives us the authorization scoping, cycle validation, and searchability the package does not demonstrably provide. Use the package as a reference implementation during the spike: read how it wires the field, confirm the Nova 3-era assumptions, and then decide. Adopt outright only if (a) we are already on the Nova major it supports, (b) wamadev/parental is genuinely load-bearing and separately assessed, and (c) it is confined to internal, low-cardinality hierarchies behind a wrapper. Otherwise the asymmetric dependency — a stale dependency on a closed-source platform we must upgrade — is not worth a widget.
How can I help you explore Laravel packages today?