22
33namespace CodeZero \UniqueTranslation ;
44
5+ use DB ;
6+
57class 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