I’m struggling to work out how to validate a field in Model A that should be unique when combined with a field from Model B.
Here’s an example to clarify my question:
Page hasMany SitesPage
SitesPage belongsTo Page, belongsTo Site
Page has a slug field which should be unique across a site. Pages can be attached to any site.
Page.id
Page.slug
SitesPage.id
SitesPage.site_id
SitesPage.page_id
I have a checkUniqueSlug() custom validation method in my Page model but can’t validate the slug is unique to the site as the site_id is stored in SitesPage which isn’t available in the Page model validate method ($this->data only contains Page model data).
I can’t do the validation in the SitesPage model as SitesPage doesn’t have a slug field and I can’t see the Page post is SitesPage.
How do I create a custom validation to check the slug is unique to the site?
One solution is to move the slug into the SitesPage model but we need all shared pages to have the same slug. i.e. A shared “About Us” page must have an “about_us” slug irrespective of which site the page is attached to.
Another solution is to perform the validation in the controller before I save which would work but that feels wrong as the validation should be done in the model.
As there have been no answers and someone else might be looking for help, here’s how I ended up with a solution:
As the controller is the only place where both model data is present in the data array, the call to validate has to be done there.
I offloaded the validation code to the model and called it with the following:
Hope someone finds this useful.