Как вставить значение NULL в FUEL / ActiveRecord - PullRequest
0 голосов
/ 28 марта 2011

Краткая информация: я пытался задать это на форумах FUEL, но каждый раз, когда я пытаюсь зарегистрироваться, на их форуме появляется сообщение «Не удалось отправить электронное письмо с кодом активации», и я не могу войти или сбросить свою учетную запись. Так что, надеюсь, люди здесь проверят это. Я видел некоторых разработчиков FUEL на этом сайте раньше.

Вот пример таблицы mysql:

CREATE TABLE `test` (
  `user_id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
  `username` VARCHAR( 128 ) NULL ,
  `last_login` DATETIME NULL
) ENGINE = InnoDB 

Очевидно, в отличие от многих, мне лично нравится использовать значение NULL для баз данных. С точки зрения непрофессионала, NULL означает, что он никогда не был инициализирован значением. В этом случае, если наш пользователь никогда не входил в систему, я хочу, чтобы это было отражено в его записи, имея значение last_login, равное NULL. Итак, NULL = "никогда не входил."

Если бы я должен был добавить нового пользователя в свою базу данных через командную строку или что-то вроде phpMyAdmin, я набрал бы следующий запрос.

INSERT INTO `test` (
    `user_id` ,
    `username` ,
    `last_login`
)
VALUES (
    NULL , 'test_person_1', NULL
);

Это результат этого запроса.

+---------+---------------+--------------+
| user_id |    username   |  last_login  |
+---------+---------------+--------------+
|    1    | test_person_1 |     NULL     |
+---------+---------------+--------------+

Теперь давайте используем FUEL ActiveRecord

Вот моя модель (достаточно простая):

<?php

class Model_Test extends ActiveRecord\Model { 

    public $primary_key = 'user_id';
    public $table_name = 'test';  // Why does fuel want to pluralize table names?  Grr.

}

А вот супер базовый пример метода контроллера, который вставляет запись в таблицу. Я знаю, что никогда не захочу, чтобы действие снова и снова вставляло одни и те же данные. Это просто тест. Круто?

public function action_save_example1()
{
    $o_user = new Model_Test(array(
        'username' => 'test_person_2',
    ));
}

И вот что я получаю после запуска этого метода:

mysql> select * from test;
+---------+---------------+---------------------+
| user_id | username      | last_login          |
+---------+---------------+---------------------+
|       1 | test_person_1 | NULL                |
|       2 | test_person_2 | 0000-00-00 00:00:00 |
+---------+---------------+---------------------+
2 rows in set (0.00 sec)

Обратите внимание, что поле DATETIME test_person_2 имеет значение "0000-00-00 00:00:00". Это не NULL. Даже если я специально укажу, что last_login имеет значение null, класс FUEL ActiveRecord принимает значение не null. Пример. * * 1 027

public function action_save_example1()
{
    $o_user = new Model_Test(array(
        'username' => 'test_person_2',
        'last_login' => NULL
    ));
}

У меня такое ощущение, что это запрос, который запускает ActiveRecord.

INSERT INTO `portal_links`.`test` (
    `user_id` ,
    `username` ,
    `last_login`
)
VALUES (
    NULL , 'test_person_2', ''
);

Должна быть какая-то логика для проверки, если значение === NULL перед вставкой или обновлением, и если оно NULL, оно должно использовать ключевое слово NULL, а не ''. Класс ActiveRecord CodeIgniter, кажется, понимает разницу между NULL и ''.

<?php
// CodeIgniter Example
$o_query = $this->db->insert('test', array(
   'user_id' => NULL,
   'username' => 'code_igniter_user',
   'last_login' => NULL
));

1 Ответ

1 голос
/ 01 апреля 2011

Не то чтобы это ответ на ваш вопрос.Но AR уже потерял поддержку.Посмотрите на новый пакет orm.Документы в разработке.

Удачи.

...