Package Data | |
---|---|
Maintainer Username: | codezero |
Maintainer Contact: | ivan@codezero.be (Ivan Vermeyen) |
Package Create Date: | 2017-10-17 |
Package Last Update: | 2024-04-17 |
Home Page: | |
Language: | PHP |
License: | MIT |
Last Refreshed: | 2024-12-15 15:13:19 |
Package Statistics | |
---|---|
Total Downloads: | 636,762 |
Monthly Downloads: | 19,760 |
Daily Downloads: | 239 |
Total Stars: | 181 |
Total Watchers: | 8 |
Total Forks: | 24 |
Total Open Issues: | 1 |
Imagine you want store a slug
for a Post
model in different languages.
The amazing spatie/laravel-translatable
package makes this a cinch!
But then you want to make sure each translation is unique for its language.
That's where this package comes in to play.
Require the package via Composer:
composer require codezero/laravel-unique-translation
Laravel will automatically register the ServiceProvider.
For the following examples, I will use a slug
in a posts
table as the subject of our validation.
Your form can submit a single slug:
<input name="slug">
We can then check if it is unique in the current locale:
$attributes = request()->validate([
'slug' => 'required|unique_translation:posts',
]);
You could also use the Rule instance:
use CodeZero\UniqueTranslation\UniqueTranslationRule;
$attributes = request()->validate([
'slug' => ['required', UniqueTranslationRule::for('posts')],
]);
Your form can also submit an array of slugs.
<input name="slug[en]">
<input name="slug[nl]">
We need to validate the entire array in this case. Mind the slug.*
key.
$attributes = request()->validate([
'slug.*' => 'unique_translation:posts',
// or...
'slug.*' => UniqueTranslationRule::for('posts'),
]);
Maybe your form field has a name of post_slug
and your database field slug
:
$attributes = request()->validate([
'post_slug.*' => 'unique_translation:posts,slug',
// or...
'post_slug.*' => UniqueTranslationRule::for('posts', 'slug'),
]);
If you are using multiple database connections, you can specify which one to use by prepending it to the table name, separated by a dot:
$attributes = request()->validate([
'slug.*' => 'unique_translation:db_connection.posts',
// or...
'slug.*' => UniqueTranslationRule::for('db_connection.posts'),
]);
If you're updating a record, you may want to ignore the post itself from the unique check.
$attributes = request()->validate([
'slug.*' => "unique_translation:posts,slug,{$post->id}",
// or...
'slug.*' => UniqueTranslationRule::for('posts')->ignore($post->id),
]);
If your ID column has a different name, or you just want to use another column:
$attributes = request()->validate([
'slug.*' => 'unique_translation:posts,slug,ignore_value,ignore_column',
// or...
'slug.*' => UniqueTranslationRule::for('posts')->ignore('ignore_value', 'ignore_column'),
]);
You can add 4 types of where clauses to the rule.
where
$attributes = request()->validate([
'slug.*' => "unique_translation:posts,slug,null,null,column,value",
// or...
'slug.*' => UniqueTranslationRule::for('posts')->where('column', 'value'),
]);
whereNot
$attributes = request()->validate([
'slug.*' => "unique_translation:posts,slug,null,null,column,!value",
// or...
'slug.*' => UniqueTranslationRule::for('posts')->whereNot('column', 'value'),
]);
whereNull
$attributes = request()->validate([
'slug.*' => "unique_translation:posts,slug,null,null,column,NULL",
// or...
'slug.*' => UniqueTranslationRule::for('posts')->whereNull('column'),
]);
whereNotNull
$attributes = request()->validate([
'slug.*' => "unique_translation:posts,slug,null,null,column,NOT_NULL",
// or...
'slug.*' => UniqueTranslationRule::for('posts')->whereNotNull('column'),
]);
Your existing slug
column (JSON) in a posts
table:
{
"en":"not-abc",
"nl":"abc"
}
Your form input to create a new record:
<input name="slug[en]" value="abc">
<input name="slug[nl]" value="abc">
Your validation logic:
$attributes = request()->validate([
'slug.*' => 'unique_translation:posts',
]);
The result is that slug[en]
is valid, since the only en
value in the database is not-abc
.
And slug[nl]
would fail, because there already is a nl
value of abc
.
Whether you are validating a single translation ('slug'
) or an array of translations ('slug.*'
), if validation fails, you will find an error for both the single and the localized key:
$errors->first('slug');
$errors->first('slug.en');
You can pass your own error message with any of the following keys. The first one found will be used.
$attributes = request()->validate([
'slug.*' => 'unique_translation:posts',
], [
'slug.unique_translation' => 'Your custom :attribute error.',
'slug.*.unique_translation' => 'Your custom :attribute error.',
'slug.en.unique_translation' => 'Your custom :attribute error.',
]);
vendor/bin/phpunit
If you discover any security related issues, please e-mail me instead of using the issue tracker.
See a list of important changes in the changelog.
The MIT License (MIT). Please see License File for more information.