Активен запис на Codeigniter, където не работи

Изпълнявам CodeIgniter, използвайки активни записи. По-долу е структурата на моята таблица:

id (int)   user (int)   is_complete (tinyint)
------------------------------------------------
1          24           1
2          24           1
3          24           NULL
4          24           0
5          24           0

Случай 1

$this->db->where('user', 24);

Запитване:

SELECT * FROM `table` WHERE `user` = 24

Работи и се връща:

id   user   is_complete
--------------------------
1    24     1
2    24     1
3    24     NULL
4    24     0
5    24     0

Случай 2

$this->db->where('user', 24);
$this->db->where('is_complete', 1);

Запитване:

SELECT * FROM `table` WHERE `user` = 24 AND `is_complete` = 1

Работи и се връща:

id   user   is_complete
--------------------------
1    24     1
2    24     1

Случай 3

$this->db->where('user', 24);
$this->db->where('is_complete !=', 1);

Запитване:

SELECT * FROM `table` WHERE `user` = 24 AND `is_complete` != 1

Не работи и се връща:

id   user   is_complete
--------------------------
4    24     0
5    24     0 

Случай 4

$this->db->where('user', 24);
$this->db->where('is_complete <>', 1);

Запитване:

SELECT * FROM `table` WHERE `user` = 24 AND `is_complete` <> 1

Не работи и се връща:

id   user   is_complete
--------------------------
4    24     0
5    24     0 

Необходим резултат

Той трябва да върне:

id   user   is_complete
--------------------------
3    24     NULL
4    24     0
5    24     0

Правя ли нещо нередно, използвайки метода where(), или има по-добър начин да постигна това?


person doitlikejustin    schedule 12.09.2013    source източник
comment
и ако го сравнявате с 0 или NULL - получавате желания резултат?   -  person Ofir Baruch    schedule 12.09.2013
comment
0 не работи, NULL работи   -  person doitlikejustin    schedule 12.09.2013
comment
Корекция: 0 работи, NULL работи   -  person doitlikejustin    schedule 12.09.2013
comment
Можете ли да отстраните грешки в заявката? Искам да кажа, изведете sql заявката, която тези команди създават?   -  person Ofir Baruch    schedule 12.09.2013
comment
Отстранете грешки в заявката с echo $this->db->last_query(); копирайте и поставете заявката в phpMyAdmin и проверете дали работи.   -  person Massimiliano Marini    schedule 12.09.2013
comment
Добре, актуализирах със заявки и най-новите резултати. НЕ грабва NULL стойности.   -  person doitlikejustin    schedule 12.09.2013
comment
в активен запис трябва да направите това, за да приемете null $where_array = ('id IS NULL' => NULL);   -  person Kyslik    schedule 13.09.2013


Отговори (3)


Това е проблем на ниво база данни, въпреки че не е грешка - така SQL работи с нулеви стойности. Тази заявка:

SELECT
    *
FROM
    `table`
WHERE
    `user` = 24 AND `is_complete` != 1

ще върне записи, където is_complete не е равно на 1, но не е нула. Ако искате да включите и нулеви записи, ще трябва да направите следното:

SELECT
    *
FROM
    `table`
WHERE
    `user` = 24 AND
    (`is_complete` != 1 OR `is_complete` IS NULL)

Като сравнявате колона с различна от нула стойност, вие автоматично изключвате нули, които трябва да се третират с различен синтаксис.

Ще трябва да добавите допълнителна клауза в скоби за заявката; вижте тук как.

person halfer    schedule 12.09.2013
comment
Така че, ако is_complete също има стойности '2' и '3', бих използвал същия синтаксис, който предоставихте? Тъй като != 1 ще се погрижи за ВСИЧКИ стойности (0,2,3) с изключение на NULL, а IS NULL обработва всички NULL стойности? - person doitlikejustin; 12.09.2013
comment
Да, така е :). Not equals ще работи върху всякакви реални стойности, освен null. - person halfer; 12.09.2013
comment
Страхотно! Току-що го пробвах и работех точно както искам, използвах клаузата в скоби where() и това също проработи. Благодаря - person doitlikejustin; 12.09.2013
comment
Страхотен. Бих предположил, че когато инжектирате свои собствени стойности в низ where(), трябва ръчно да ги обезвредите. За цели числа можете просто да прехвърлите към (int), въпреки че се надяваме, че има и система за параметризиране в CI ActiveRecord. - person halfer; 13.09.2013

Случай 3 работи. NULL е различно в SQL от число и се нуждае от различен компаратор. Начинът, по който го мисля е, че NULL е липсата на каквото и да било, докато 0 е числото 0; това е фина разлика. Така че != 1 дава всички числа с изключение на 1, докато за да намерите нула, трябва да използвате is / is not null компаратора.

Заявката за намиране на вашия задължителен резултат е:

$this->db->where("((is_complete = 0) OR (is_complete is null))",NULL,FALSE);

Търсенето на != 1 не е същото като търсенето на = 0. (Ако е възможно is_complete има стойност, която е да речем '3'. Може да получите по-малко проблеми в кода си, ако търсите това, което искате, вместо това, което не трябва да бъде там).

Операторът where очаква втори параметър, ако се използва третият (FALSE) параметър за премахване на обратни отметки.

person pgee70    schedule 22.09.2013

Винаги е по-добре да използвате активни записи за поддръжка на множество бази данни.

Можете да използвате активни записи като този за вашата заявка

Случай 3

$this->db->where('user', 24, FALSE);
$this->db->where('is_complete !=', 1, FALSE);

Случай 4

$this->db->where('user', 24, FALSE);
$this->db->where('is_complete <>', 1, FALSE);

Третият параметър се използва за премахване на обратната отметка, която причинява проблем с sql заявката.

person Binayak Das    schedule 29.06.2017