За последние 24 часа нас посетили 15739 программистов и 1646 роботов. Сейчас ищет 881 программист ...

Kohana транзакция и отлов ошибок ORM моделей. {Решено}

Тема в разделе "Прочие вопросы по PHP", создана пользователем olegkaz, 3 апр 2013.

  1. olegkaz

    olegkaz Активный пользователь

    С нами с:
    21 фев 2013
    Сообщения:
    121
    Симпатии:
    0
    Привет всем, есть такая проблема с траназакцией и валидацией ошибок на кохане. Имеется несколько таблиц :

    Код (Text):
    1.  
    2. Table1
    3. id_table1     name      text
    4.  
    5.  
    6. Table2
    7. id_table2     id_table1      text
    8.  
    9.  
    10. Table3
    11. id_table3     id_table1      text
    Все имеет связи на уровне mysql. В каждой моделе ORM у Коханы прописаны правила (rule) к таблицам чтобы поля text не было пустым (not_empty). Так вот, как сделать так что если в какой-то таблице попытались добавить пустое значение в столбец text, то происходила транзакция и выдавалась ошибка.

    Сейчас мой код такой, но при добавлении в первую таблицу, сразу всё проходит и транзакция не отрабатывается.

    Код (Text):
    1.  
    2. // Начало транзакции
    3.         $db = Database::instance();
    4.         $db->begin();
    5.          
    6.         try
    7.         {
    8.             $t1 = ORM::factory('Table1');
    9.             $t1->name = 'Имя';
    10.             $t1->text = 'какой-то текст для таблицы 1';
    11.  
    12.             try
    13.             {
    14.                 $t1->save();
    15.             }
    16.             catch(ORM_Validation_Exception $e)
    17.             {
    18.                 $errors_action[] = $e->errors('Validation');
    19.             }
    20.  
    21.  
    22.             $t2 = ORM::factory('Table2');
    23.             $t2->id_table1 = $t1->pk();
    24.             $t2->text = 'какой-то текст для таблицы 2';
    25.  
    26.             try
    27.             {
    28.                 $t2->save();
    29.             }
    30.             catch(ORM_Validation_Exception $e)
    31.             {
    32.                 $errors_action[] = $e->errors('Validation');
    33.             }
    34.  
    35.  
    36.            $t3 = ORM::factory('Table3');
    37.             $t3->id_table1 = $t1->pk();
    38.             $t3->text = 'какой-то текст для таблицы 3';
    39.  
    40.             try
    41.             {
    42.                 $t3->save();
    43.             }
    44.             catch(ORM_Validation_Exception $e)
    45.             {
    46.                 $errors_action[] = $e->errors('Validation');
    47.             }
    48.  
    49.            var_dump($errors_action);
    50.            
    51.             $db->commit();
    52.         }
    53.         catch(Database_Exception $e)
    54.         {
    55.             echo 'Сработала транзакция';
    56.             $e->getMessage();
    57.             $db->rollback();
    58.         }
    Проблема решена. Простой проверкой массива $errors_action, если он не пуст то $db->rollback.