Skip to content

Commit 1adf0d7

Browse files
committed
Refactor UniqueTranslationValidator
1 parent 420a1ed commit 1adf0d7

File tree

1 file changed

+71
-10
lines changed

1 file changed

+71
-10
lines changed

src/UniqueTranslationValidator.php

Lines changed: 71 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
namespace CodeZero\UniqueTranslation;
44

5+
use DB;
6+
57
class UniqueTranslationValidator
68
{
79
/**
@@ -15,23 +17,82 @@ class UniqueTranslationValidator
1517
* @return bool
1618
*/
1719
public function validate($attribute, $value, $parameters, $validator) {
20+
$attributeParts = explode('.', $attribute);
21+
$attribute = $attributeParts[0];
22+
$locale = $attributeParts[1] ?? app()->getLocale();
1823
$table = $parameters[0] ?? null;
1924
$column = $parameters[1] ?? null;
2025
$ignoreValue = $parameters[2] ?? null;
21-
$ignoreColumn = $parameters[3] ?? 'id';
22-
23-
$rule = new UniqueTranslationRule($table, $column);
24-
25-
if ($ignoreValue !== null) {
26-
$rule->ignore($ignoreValue, $ignoreColumn);
27-
}
26+
$ignoreColumn = $parameters[3] ?? null;
2827

29-
$passes = $rule->passes($attribute, $value);
28+
$isUnique = $this->isUnique($attribute, $locale, $value, $table, $column, $ignoreValue, $ignoreColumn);
3029

3130
$validator->setCustomMessages([
32-
'unique_translation' => $rule->message(),
31+
'unique_translation' => trans('validation.unique'),
3332
]);
3433

35-
return $passes;
34+
return $isUnique;
35+
}
36+
37+
/**
38+
* Check if a translation is unique.
39+
*
40+
* @param string $attribute
41+
* @param string $locale
42+
* @param mixed $value
43+
* @param string $table
44+
* @param string|null $column
45+
* @param mixed $ignoreValue
46+
* @param string|null $ignoreColumn
47+
*
48+
* @return bool
49+
*/
50+
protected function isUnique($attribute, $locale, $value, $table, $column = null, $ignoreValue = null, $ignoreColumn = null)
51+
{
52+
$column = $column ?: $attribute;
53+
54+
$query = $this->findTranslation($table, $column, $locale, $value);
55+
$query = $this->ignore($query, $ignoreColumn, $ignoreValue);
56+
57+
$isUnique = $query->count() === 0;
58+
59+
return $isUnique;
60+
}
61+
62+
/**
63+
* Find the given translated value in the database.
64+
*
65+
* @param string $table
66+
* @param string $column
67+
* @param string $locale
68+
* @param mixed $value
69+
*
70+
* @return \Illuminate\Database\Query\Builder
71+
*/
72+
protected function findTranslation($table, $column, $locale, $value)
73+
{
74+
return DB::table($table)->where("{$column}->{$locale}", '=', $value);
75+
}
76+
77+
/**
78+
* Ignore the column with the given value.
79+
*
80+
* @param \Illuminate\Database\Query\Builder $query
81+
* @param string|null $column
82+
* @param mixed $value
83+
*
84+
* @return \Illuminate\Database\Query\Builder
85+
*/
86+
protected function ignore($query, $column = null, $value = null)
87+
{
88+
if ($value !== null && $column === null) {
89+
$column = 'id';
90+
}
91+
92+
if ($column !== null) {
93+
$query = $query->where($column, '!=', $value);
94+
}
95+
96+
return $query;
3697
}
3798
}

0 commit comments

Comments
 (0)