You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
68 lines
1.6 KiB
68 lines
1.6 KiB
<?php
|
|
|
|
namespace App\Rules;
|
|
|
|
use Illuminate\Contracts\Validation\Rule;
|
|
use Illuminate\Database\Eloquent\Model as Model;
|
|
use Jenssegers\Mongodb\Eloquent\Model as Document;
|
|
|
|
class ExistsRule implements Rule
|
|
{
|
|
CONST FIELD = '_id';
|
|
|
|
private Model|Document $model;
|
|
|
|
private array $invalidItems;
|
|
|
|
/**
|
|
* Create a new rule instance.
|
|
*
|
|
* @param Model|Document $model
|
|
* @param string $field
|
|
*/
|
|
public function __construct(Model|Document $model)
|
|
{
|
|
$this->model = $model;
|
|
}
|
|
|
|
/**
|
|
* Determine if the validation rule passes.
|
|
*
|
|
* @param string $attribute
|
|
* @param mixed $value
|
|
* @return bool
|
|
*/
|
|
public function passes($attribute, $value)
|
|
{
|
|
$valid = true;
|
|
$value = collect($value);
|
|
// if value is empty do not validate
|
|
if ($value->isEmpty()) {
|
|
return $valid;
|
|
}
|
|
// query to fetch records base on field and value.
|
|
$validCollection = $this->model->select(self::FIELD)
|
|
->whereIn(self::FIELD, $value->toArray())
|
|
->withoutTrash()
|
|
->get()->map(fn($m) => $m->{self::FIELD});
|
|
|
|
// check if all values are existed.
|
|
$valid = $value->count() === $validCollection->count();
|
|
// extract invalid values.
|
|
$this->invalidItems = $value->diff($validCollection)->toArray();
|
|
|
|
return $valid;
|
|
}
|
|
|
|
/**
|
|
* Get the validation error message.
|
|
*
|
|
* @return string
|
|
*/
|
|
public function message()
|
|
{
|
|
return implode(',', $this->invalidItems) .
|
|
(count($this->invalidItems) > 1 ? ' are ' : ' is ') .
|
|
'invalid!';
|
|
}
|
|
}
|