Nano Hash - криптовалюты, майнинг, программирование

Yii -CExistValidator для внешнего ключа

В простом проекте с Yii у меня есть модель:

Checkins.php

 * The followings are the available columns in table 'checkins':
 * @property integer $id
 * @property integer $user_id
 * @property integer $item_id
 * @property double $lat
 * @property double $long

Два значения $user_id и $item_id принадлежат двум другим таблицам:

public function relations()
{
    // NOTE: you may need to adjust the relation name and the related
    // class name for the relations automatically generated below.
    return array(
        'user' => array(self::BELONGS_TO, 'Users', 'user_id'),
        'item' => array(self::BELONGS_TO, 'Items', 'item_id'),
    );
}

Я определил некоторый валидатор:

public function rules()
{
    // NOTE: you should only define rules for those attributes that
    // will receive user inputs.
    return array(
        array('user_id, item_id, lat, long', 'required'),

        array('item_id', 'exist', 'on'=>'create', 'attributeName'=>'id', 'className'=>'Items'),

        array('user_id, item_id', 'numerical', 'integerOnly'=>true),
        array('lat, long', 'numerical'),
        // The following rule is used by search().
        // Please remove those attributes that should not be searched.
        array('id, user_id, item_id, lat, long', 'safe', 'on'=>'search'),


    );
}

При выполнении в actionCreate метода save() работают все валидаторы, но не тот, который предназначен для проверки наличия внешнего ключа в Items модели

array('item_id', 'exist', 'on'=>'create', 'attributeName'=>'id', 'className'=>'Items'),

И в случае, если я попытаюсь сохранить Checkins, который имеет значение в item_id, не имея того же идентификатора в Items, у меня не возникнет ошибки проверки.

Это правильный подход?

Спасибо

yii
03.04.2012

  • Да, это правильный подход, если вы хотите убедиться, что атрибут item_id должен иметь соответствующий идентификатор в другой таблице. Как ни странно, я пробовал тестировать в своем коде, и он работал нормально. Вы уверены, что не забыли задать сценарий перед сохранением? 04.04.2012

Ответы:


1

Я думаю, что это, скорее всего, потому, что вы не установили сценарий модели в 'create' перед сохранением (я просто предполагаю, что вы не прикрепляете код $checkin->save() в контроллере actionCreate.). Другая проверка сработала, скорее всего, потому что они не настроены на конкретный сценарий (т. е. они будут работать во всех проверках).

Например, если нет элемента с идентификатором 5, код ниже

    $checkin = new Checkin();
    $checkin->text = 'test';
    $checkin->item_id = 5;
    if (!$checkin->validate()){
        print_r($checkin->errors);
    }

будет работать нормально, так как сценарий Checkin не установлен на 'create' (по умолчанию 'insert'). Но я попробовал код ниже

    $checkin = new Checkin();
    $checkin->scenario = 'create'; 
    //or you can set it in the instantiation 
    //$checkin = new Checkin('create');
    $checkin->text = 'test';
    $checkin->item_id = 5;
    if (!$checkin->validate()){
        print_r($checkin->errors);
    }

Это приведет к ошибке проверки.

Можете ли вы вставить код сохранения вашей модели?

04.04.2012
  • Петра, спасибо за ответ. Да, сейчас работает. Мне было непонятно, что сценарий в actionCreate() не является «создать», если вы не установили его с помощью $checkin-›scenario = 'create'; Спасибо еще раз! 04.04.2012
  • Пожалуйста. Не забудьте отметить вопрос как answered. 04.04.2012
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..