Skip to content

Instantly share code, notes, and snippets.

@bezhanSalleh
Created February 27, 2022 14:49
Show Gist options
  • Save bezhanSalleh/0a9ed8b18346ab4b31805bbe333a1a5a to your computer and use it in GitHub Desktop.
Save bezhanSalleh/0a9ed8b18346ab4b31805bbe333a1a5a to your computer and use it in GitHub Desktop.
A Rule to validate the uniqueness of json translated fields
<?php
namespace App\Rules;
use Illuminate\Support\Facades\DB;
use Illuminate\Contracts\Validation\Rule;
class UniqueJsonRule implements Rule
{
protected ?string $ignoreColumn = null;
protected ?string $ignoreValue = null;
/**
* Create a new rule instance.
*
* @return void
*/
public function __construct(
public string $table,
public ?string $column = null,
public string $locale = 'en',
) {}
/**
* Create a new rule instance.
*
* @param string $table
* @param string|null $column
*
* @return static
*/
public static function for(string $table, ?string $column = null, ?string $locale = 'en')
{
return new static($table, $column, $locale);
}
/**
* Determine if the validation rule passes.
*
* @param string $attribute
* @param mixed $value
* @return bool
*/
public function passes($attribute, $value)
{
$query = DB::table("{$this->table}")->where("{$this->column}->{$this->locale}", $value);
if ($this->ignoreColumn) {
$query->where("{$this->ignoreColumn}", "!=", $this->ignoreValue);
}
return $query->count() === 0;
}
/**
* Get the validation error message.
*
* @return string
*/
public function message()
{
return "The {$this->column} has already been taken.";
}
public function ignore($value, string $column = 'id')
{
$this->ignoreValue = $value;
$this->ignoreColumn = $column;
return $this;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment