Skip to content

Commit 98e4ccc

Browse files
committed
Escape backslashes to work with LIKE queries (#13)
1 parent 6fb2df1 commit 98e4ccc

File tree

2 files changed

+40
-0
lines changed

2 files changed

+40
-0
lines changed

src/UniqueTranslationValidator.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,10 @@ protected function isUnique($value, $name, $locale, $parameters)
229229
*/
230230
protected function findTranslation($connection, $table, $column, $locale, $value)
231231
{
232+
// Properly escape backslashes to work with LIKE queries...
233+
// See: https://stackoverflow.com/questions/14926386/how-to-search-for-slash-in-mysql-and-why-escaping-not-required-for-wher
234+
$value = str_replace('\\', '\\\\\\\\', $value);
235+
232236
return DB::connection($connection)->table($table)
233237
->where(function ($query) use ($column, $locale, $value) {
234238
$query->where($column, 'LIKE', "%\"{$locale}\": \"{$value}\"%")

tests/UniqueTranslationTest.php

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,4 +265,40 @@ public function it_validates_nova_translations()
265265

266266
$this->assertTrue($validation->passes());
267267
}
268+
269+
/** @test */
270+
public function it_handles_backslashes_in_values()
271+
{
272+
Model::create([
273+
'slug' => ['en' => '\existing-slug-en', 'nl' => '\existing-slug-nl'],
274+
'name' => ['en' => '\existing-name-en', 'nl' => '\existing-name-nl'],
275+
]);
276+
277+
$rules = [
278+
'slug' => "{$this->rule}:{$this->table}",
279+
'name' => UniqueTranslationRule::for($this->table),
280+
];
281+
282+
// The following validation fails, because the
283+
// current locale is "en", so we actually set
284+
// ['en' => '\existing-slug-en'] etc.
285+
286+
$validation = Validator::make([
287+
'slug' => '\existing-slug-en',
288+
'name' => '\existing-name-en',
289+
], $rules);
290+
291+
$this->assertTrue($validation->fails());
292+
293+
// The following validation passes, because the
294+
// current locale is "en", so we actually set
295+
// ['en' => '\existing-slug-nl'] etc.
296+
297+
$validation = Validator::make([
298+
'slug' => '\existing-slug-nl',
299+
'name' => '\existing-name-nl',
300+
], $rules);
301+
302+
$this->assertTrue($validation->passes());
303+
}
268304
}

0 commit comments

Comments
 (0)