Kohana 3.1 ORM: как реализовать «уникальное» правило проверки?

#php #kohana #kohana-3 #kohana-orm

#php #kohana #kohana-3 #kohana-orm

Вопрос:

существует ли «уникальное» правило проверки (если существует, то как его реализовать?) или оно должно быть реализовано с помощью обратного вызова? Спасибо.

Ответ №1:

) Насколько я знаю, не существует универсального «уникального» (или «is_unique») правила класса проверки. Вероятно, это из-за нерегулярного характера такого рода проверки.

Однако, если вы хотите сделать это красиво, вы могли бы создать «базовую модель» для всех ваших моделей, которые вы используете в своем приложении (заставьте их расширять базовую). Тогда уникальность можно было бы проверить примерно так:

 public function is_unique($id)
{
    return ! (bool) DB::select(array(DB::expr('COUNT(id)'), 'total'))
        ->from($this->_table_name)
        ->where('id', '=', $id)
        ->execute()
        ->get('total');
}
  

В ваших правилах проверки вы должны добавить это правило:

 array('id' => array(array(array($this, 'is_unique')));
  

У меня есть внутренние правила модели, сохраненные в методе rules() , как рекомендовано.
Так что это могло быть живым примером:

 class Model_Base_Model extends ORM
{
    public function rules()
    {
        return array(
            'id' => array(
                array(array($this, 'is_unique')),
            );
    }


    public function is_unique($id)
    {
        return ! (bool) DB::select(array(DB::expr('COUNT(id)'), 'total'))
            ->from($this->_table_name)
            ->where('id', '=', $id)
            ->execute()
            ->get('total');
    }
}
  

Теперь каждая модель, расширяющая Model_Base_Model, теперь сможет проверять свою уникальность при создании.
Надеюсь, это поможет! 🙂

Комментарии:

1. Еще раз спасибо! Я реализовал очень похожее решение.

Ответ №2:

В Kohana 3.2 ORM есть метод unique (), который выполняет проверку, я не уверен, существует ли он в 3.1, но он должен.

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

 array(array($this, 'unique'), array('some_field', ':value')),
  

и это проверит, является ли some_field уникальным

Комментарии:

1. Да, в KO 3.2 это работает «из коробки» как по волшебству. В любом случае, вопрос относится к версии v3.1. Спасибо!

Ответ №3: