Я настраиваю пользовательское правило проверки для поля BelongsToMany
в Laravel Nova, чтобы найти его в сводной таблице и сравнить с введенным значением.Он использует функцию, которая «используется совместно» с другими полями того же ресурса.
Я использую следующий код в ресурсе Delegation
:
BelongsToMany::make('Authorities')
->fields(function ()
{
return [
Help::make('Your Limit', "Your own limit for this authority is {$this->displayYourLimit()}. You can only delegate to the limit of your authority."),
Number::make('Delegated Limit ($M)', 'delegated_limit')
->rules('required', function ($attribute, $value, $fail)
{
if ($value > $this->displayYourLimit())
{
return $fail('Your value is too high');
}
…
Рассматриваемая функция:
public function displayYourLimit()
{
$id1 = DB::table('delegations')->where('user_id', auth()->user()->id)->value('id');
$id2 = $this->pivot['authority_id']; //This returns null inside the validation rule but not the Help field
$result = DB::table('authority_delegation')->where('delegation_id', '=', $id1)->where('authority_id', '=', $id2)->value('delegated_limit');
return $result;
}
Функция охватывает две таблицы в базе данных - delegations
, которая имеет модель Delegation
и основную зависимость от BelongsToMany
с другой моделью Authority
.Сводная таблица называется authority_delegation
.
$id1
возвращает значение столбца id
таблицы delegations
для текущего пользователя, вошедшего в систему.Это прекрасно работает.
$id2
должен возвращать значение столбца delegation_id
сводной таблицы authority_delegation
для просматриваемого в данный момент ресурса Authority
, подключенного к ресурсу Delegation
.Это в основном 26 в следующем URL-адресе http://localhost:8000/nova/resources/delegations/2/edit-attached/authorities/26?viaRelationship=authorities
, который я пытаюсь получить.
Наконец, $result
возвращает значение столбца delegated_limit
authority_delegation
, где совпадают значения двух первых столбцов,Это также отлично работает при условии, что $id2
отправляет правильное значение.
Я ожидаю, что функция вернет число с плавающей запятой, которое можно использовать как для отображения в поле справки, так и для проверки в поле числа.Тем не менее, при работе в поле справки идеально, он не работает при проверке (ожидаемая проверка не имеет никакого эффекта после required
. Через тестирование я вижу, что он возвращает null
при получении $id2
из сводки в рамках проверкиФункция правила. Я прилагаю иллюстрацию для иллюстрации. На изображении зеленый кружок показывает, что необходимое значение правильно отображается в одном поле, красный кружок показывает, что оно не проходит проверку правильности.
Иллюстрацияpivot, возвращающего нуль внутри пользовательской функции правила Laravel Nova, но не за ее пределами
Но почему это работает в одном поле, а не в другом?
Я потратил день, пытаясь понять этоЯ попытался преобразовать в массив, в объект и т. д. безрезультатно. Если я смогу получить id
просматриваемого в данный момент ресурса - то есть неуловимого 26 - любым другим способом, я бы хотел знать!
У меня установлены соответствующие отношения в соответствующих моделях Authority
и Delegation
:
public function authorities()
{
return $this->belongsToMany(Authority::class, 'authority_delegation')->withPivot('delegated_limit', 'further_delegatable', 'master_delegated_limit', 'authority_id', 'delegation_id')->withTimestamps();
}
and
public function delegations()
{
return $this->belongsToMany(Delegation::class, 'authority_delegation')->withPivot('delegated_limit', 'further_delegatable', 'master_delegated_limit', 'authority_id', 'delegation_id')->withTimestamps();
}
Все предложенияочень добро пожаловать!