Pivot возвращает значение null внутри пользовательской функции правила Laravel Nova, но не за ее пределами - PullRequest
0 голосов
/ 27 сентября 2019

Я настраиваю пользовательское правило проверки для поля 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();
    }

Все предложенияочень добро пожаловать!

...