2015-09-17 3 views
1

Я написал собственный метод правил для проверки наличия записи в БД перед добавлением новой записи. Я поместил метод в поведение, чтобы я мог поделиться им с другими моделями, но я столкнулся с ситуацией с курицей и яйцом.CakePHP Подтвердить конкретное правило только в том случае, если пара обязательных полей не пуста

Чтобы узнать, есть ли у категории определенное имя группы, мне нужно иметь идентификатор категории и имя группы. Поэтому я передаю эти ключи с помощью моего собственного правила (category_id и name). Но это не сработает, так как если я не выберу category_id по ошибке, тогда запрос будет происходить только по имени, поэтому я исправил это с помощью пары строк, но мне нужно вернуть true, если это так, и банк проверка категории_id недействительна.

Есть ли лучший способ реализовать такую ​​проверку? Разве это не так плохо, как я думаю? Или просто не беспокойтесь, и в моем контроллере drop hasAny() при моем вызове validates(), если он пройдет.

MODEL: 
public $validate = [ 
    'category_id' => [ 
     'rule' => 'notEmpty', 
     'message' => 'Category is required.' 
    ], 
    'name'  => [ 
     'notEmpty'  => [ 
      'rule' => 'notEmpty', 
      'message' => 'Team is required.' 
     ], 
     'recordExists' => [ 
      'rule' => [ 'recordExists', [ 'category_id', 'name' ] ], 
      'message' => 'Group already exists.' 
     ] 
    ] 
]; 

// BEHAVIOR: 
public function recordExists(Model $Model, $conditions, $requireKeys) 
{ 
    // Overrite conditions to 
    $conditions = $Model->data[ $Model->name ]; 

    // Trim all array elements and filter out any empty indexes 
    $conditions = array_map('trim', $conditions); 
    $conditions = array_filter($conditions); 

    // Get the remaining non-empty keys 
    $conditionKeys = array_keys($conditions); 

    // Only query for record if all required keys are in conditions 
    if (empty(array_diff($requireKeys, $conditionKeys))) { 
     return !$Model->hasAny($conditions); 
    } 

    // NOTE: seems wrong to return true based on the assumption the category_id validation has probably failed 
    return true; 
} 

ответ

2

Используйте beforeValidate() дозвона модели, чтобы проверить, если поля присутствуют и если они пусты. Если они пустые, просто отключите() правило проверки recordExists в свойстве проверки подлинности моделей. Скопируйте их во временную переменную или свойство в случае, если вы хотите установить их обратно после текущей операции.

И использовать $Model->alias, name будет разорвать, если модель используется через ассоциацию, которая имеет другое имя.

$conditions = $Model->data[ $Model->name ];