Set Unique Slug In Laravel With Unique Counter

In a recent Laravel project I needed a way to get pretty URLs BUT to ensure that they are unique. You might think, why not just set the column to UNIQUE in SQL? Simple, with a multi-tenant setup we needed it unique but only unique to the tenant but we also wanted it to auto-increment a counter at the end of the slug if there was already a slug like it.

For example, if you wanted to save the About Us page though you already have a About Me page with the slug “slug”, then you wouldn't be able to save the About Us page with the slug “/about” correct? With the code we have here it'll save the new page (or whichever page is being created/updated last) with “/about-<counter>” where the counter starts at 1. So in this example it would save it as “/about-1”.

This is a rather standard implementation of this idea. WordPress has had it for a long while now. A rather handy feature.

I've added the link to the GitHub code below. There are a few things to note though:

  • The model is automatically chosen for you,
  • the only thing you have to set is the default slug (pulled from a model attribute of your choice),
  • It's assumed the attribute for your slug is ‘slug', but you can set that too,
  • The first IF statement is a small extra safety check: if the value didn't update then don't run

Need Laravel Support, Help & Development?

If you liked this free GIST code, feel free to connect with me to get help on your projects. I offer hourly, weekly, monthly retainer and project rates.