Yii2 проверить существование в модели - PullRequest
1 голос
/ 21 октября 2019

Для моего программного обеспечения я должен запретить пользователю продавать больше акций, чем они находят в базе данных, поэтому для начала мне нужно задать поле акций в виде целого числа без знака.

Проблема в том, что хотяэти единицы не могут быть проданы и вычтены, продажа создается без запаса, потому что она не проверена.

Для осуществления продажи у меня есть три модели, соответствующие трем таблицам в базе данных: запас, детали продажи ипродажа.

Для проверки создайте несколько функций, чтобы зарегистрированные данные таблиц находились в базе данных следующим образом:

public function getDetails()
{
    return $this->hasOne(Articledetail::className(), ['ID_ARTICLE_DETAIL' => 'ID_ARTICLE_DETAIL']);
}

public function getExistences()
{
    if ($mother = Articledetail::findOne($this->mother))
    {
        return $mother->details->ARTICLE_STOCK;
    }
}

Затем должна быть возможность проверки модели с помощьюследующее правило:

public function rules()
{

    return [
        ['STOCK', 'compare', 'compareAttribute' => 'existences', 'operator' => '<='],
    ];
}

Проблема в том, что я думаю, что вы не получаете целочисленное значение таблицы в базе данных, потому что в форме не имеет значения, какое значение вы вводите, оновсегда говорит, что она должна быть меньше или равна функции существования.

Ответы [ 2 ]

0 голосов
/ 21 октября 2019
  return [
      ['STOCK',
          function ($attribute) {
              if ($this->$attribute >= $yourModelexistences::find()....) { //Get the amount of existences from the database
                  $this->addError($attribute, Yii::t('user', 'The amount is...'));
              }
          }
      ]

Или

protected $_existences;

public function rules()
{
  ['STOCK',
      function ($attribute) {
          if ($this->_existences === null || $this->attribute >= $this->_existences->existences) {
              $this->addError($attribute, Yii::t('user','The amount is Greater ..'));
          }
      }
  ]

    public function beforeValidate()
    {
        if (parent::beforeValidate()) {
            $this->_existences = existencesModel::findOne($STOCK_id); //Change according to your model and codes 
            return true;
        } else {
            return false;
        }
    }

Или

public function rules()
{
       return [
            ['STOCK', 'compare', 'compareValue' => $yourModelexistences::find()...., 'operator' => '>='],
    ]
}
#code ...
0 голосов
/ 21 октября 2019

Возможно, проблема в проверке на стороне клиента. Проверка на стороне клиента \yii\validators\CompareValidator предназначена для сравнения двух полей ввода, но вам не с чем сравнивать. В вашем случае, вероятно, лучший вариант - пропустить проверку на стороне клиента для этого правила и использовать это правило только во время проверки на стороне сервера. Для этого установите для свойства $enableClientValidation значение false в определении правила следующим образом:

public function rules()
{
    return [
        [
            'STOCK',
            'compare',
            'compareAttribute' => 'existences',
            'operator' => '<=',
            'enableClientValidation' => false,
        ],
    ];
}

Также иметь метод, который возвращает некоторое значение в ветви if и не имеет возврата в основной ветви, это плохая практикаприглашает клоповВ вашем getExistences вы должны вернуть какое-то значение по умолчанию (например, 0) или выбросить исключение, если ничего не найдено findOne.

...