Пользователь отношения проверки октябрь

У меня есть следующие отношения с моделью пользователя

public $belongsTo = [
    'user' => [
        'Rainlab\User\Models\User',
        'key' => 'user_id',
        'order'      => 'name asc'
    ]
];

config_relation.yaml

user:
label: Usuários
view:
   form: $/rainlab/user/models/user/fields.yaml
   toolbarButtons: create|link
manage:
  showSearch: true
  showCheckBoxes: true
  recordsPerPage: 10
  list: $/rainlab/user/models/user/columns.yaml
  form: $/rainlab/user/models/user/fields.yaml

Я делаю проверку на user поле, но оно не работает, хотя я уже выбрал пользователя, он продолжает информировать, что мне нужно выбрать пользователя

/**
 * @var array Validation rules
 */
public $rules = [
    'user' => 'required'
];

1 ответ

Решение

Да, I can Understand your problem, это произойдет только тогда, когда вы собираетесь добавить новую запись.

Это будет отлично работать для existing record, что касается existing record данные persisted in database так что мы можем представить рабочую запись, а затем мы можем уволить relational validation в теме.

но для new record нет идентификатора значит запись it self не сохраняется в базе данных, поэтому не будет никакой связи с этим реляционным полем, поэтому мы никогда не знаем, к какому полю это имеет какое-либо значение или нет, и проверка будет терпеть неудачу все время.

поэтому независимо от того, сколько записей вы добавите, он покажет ERROR each time что "пожалуйста, выберите пользователя".

Использование CMS в октябре differ binding Вы можете видеть, что можете добавлять пользователей без сохранения текущей записи. как эти данные хранятся в промежуточной таблице, так что после создания записи, что relation data will be transferred to created record потому что теперь у него есть it's own ID and persisted in database,

поэтому для решения вам нужно добавить проверку вручную внутри этой модели, с differed binding scope,

Сначала удалите поле user от rules

/**
 * @var array Validation rules
 */
public $rules = [
    'user' => 'required' <-- Remove this 
];

Сейчас сделаем manual validation

Добавь это code на ваш model

public function beforeValidate() {

    // we need to check record is created or not
    if($this->id == NULL) {

        // CREATE CASE

        // we need to use differ binding scope as this record is not saved yet.
        if($this->user()->withDeferred(post('_session_key'))->count() == 0) {
            throw new \ValidationException(['user' => 'We need User !']);
        }
    }
    else {

        // UPDATE CASE

        // now record is created so we dont need differ binding
        if($this->user()->count() == 0) {
            throw new \ValidationException(['user' => 'We need User !']);
        }
    }
}

Теперь валидация может работать на both case и вы можете добавить различные проверки для different cases,

Теперь проверка будет работать правильно.

если вы все еще найдете проблему, пожалуйста, прокомментируйте.

Другие вопросы по тегам