Проверьте значение NULL, используя PhpActiveRecord

Согласно документации здесь (http://www.phpactiverecord.org/projects/main/wiki/Finders)

Есть способ найти записи в базе данных, как показано ниже.

 # fetch all lousy romance novels which are cheap
Book::all(array('conditions' => array('genre = ? AND price < ?', 'Romance', 15.00)));
# sql => SELECT * FROM `books` WHERE genre = 'Romance' AND price < 15.00

Это, однако, не будет работать, если любое из значений NULL. Это просто потому, что NULL не является каким-либо значением, поэтому ему не с чем сравнивать. Это я понимаю, но в документации я не могу понять, как на самом деле проверить, используя этот формат, если значение равно нулю или нет.

В SQL вы можете просто сказать WHERE значение равно нулю или не равно нулю, но с PHPActiveRecord строка массива условия я не уверен …

Причина, по которой я хочу сделать это с помощью строки условия и массива, заключается в том, что у меня есть настройка кода, которая автоматически создает эти условия, я опубликую код ниже.

    function create_find_options($fields,$operators,$values,$sortfields,$sortdirections,$limit,$offset,$logic){
$conditionstring = '';
$fieldcount = count($fields);
$i=0;

for($k=0;$k<count($logic)-1;$k++){
$conditionstring.="(";//add starting parenthesis for every known logic.
}

for($i=0;$i<$fieldcount;$i++){
$conditionstring.=$fields[$i];
switch($operators[$i]){
case "equals":
$conditionstring.=" = ?";
break;
case "greaterthan":
$conditionstring.=" > ?";
break;
case "lessthan":
$conditionstring.=" < ?";
break;
case "notequals":
$conditionstring.=" != ?";
break;
case "contains":
$conditionstring.=" LIKE ?";
break;
}

if($i!=$fieldcount-1 && $fieldcount>=2){
if($i>0){
$conditionstring.=")";//first condition does not get ending parenthesis.
}
$conditionstring.=" ".$logic[$i]." ";//AND or OR
}
}

//$conditionstring = substr($conditionstring,0,strlen($conditionstring)-5);
//die($conditionstring);

$options = array('conditions' => array($conditionstring));

$i=0;
for($i=0;$i<$fieldcount;$i++){
if($operators[$i]=="contains"){ //exception for contains because it needs the percentage symbols around the value.
$options['conditions'][] = "%".$values[$i]."%";
}else{
$options['conditions'][] = $values[$i];
}
}

//Add any sorts now.
$i=0;
$sortcount = count($sortfields);
$orderstring = '';
for($i=0;$i<$sortcount;$i++){
$orderstring.= $sortfields[$i]." ".$sortdirections[$i].",";
}
$orderstring = rtrim($orderstring,",");//remove trailing comma

$options['order'] = $orderstring;//sets order rules.

//Add any limits now.
if(isset($limit)){
$options['limit']   = $limit;
}
if(isset($offset)){
$options['offset']  = $offset;
}

return $options;
}

Таким образом, моя функция автоматически создаст необходимую строку условия, но она завершится с ошибкой NULL по причине, описанной выше. Я думаю, что мне нужно добавить некоторые дополнительные условия здесь, что если я обнаружу НОЛЬ как справиться с этим лучше, но я не уверен, как это сделать, или если это возможно с PHPActiveRecord?

1

Решение

Хорошо проведя … весь день, я нашел решение. Я предполагаю, что это мог быть здравый смысл, но это не было в документации, поэтому я должен был догадаться.

По-видимому, вы можете просто сказать ‘null’ в строке условия, как обычный SQL, и это будет работать …

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

Надеюсь, это кому-нибудь пригодится! В моей ситуации я хотел, чтобы 0 было равно нулю, чтобы вы могли соответственно отрегулировать ситуацию.

function create_find_options($fields,$operators,$values,$sortfields,$sortdirections,$limit,$offset,$logic){
$conditionstring = '';
$fieldcount = count($fields);
$i=0;

for($k=0;$k<count($logic)-1;$k++){
$conditionstring.="(";//add starting parenthesis for every known logic.
}

for($i=0;$i<$fieldcount;$i++){
$conditionstring.=$fields[$i];
$nullFound = false;
if($values[$i]=='0'){
$nullFound = true;
}
switch($operators[$i]){
case "equals":
if($nullFound==true){
$conditionstring.=" is null OR ".$fields[$i].' = 0';
}else{
$conditionstring.=" = ?";
}
break;
case "greaterthan":
$conditionstring.=" > ?";
break;
case "lessthan":
$conditionstring.=" < ?";
break;
case "notequals":
if($nullFound==true){
$conditionstring.=" is not null OR ".$fields[$i].' != 0';
}else{
$conditionstring.=" != ? OR ".$fields[$i].' is null';
}
break;
case "contains":
$conditionstring.=" LIKE ?";
break;
}

if($i!=$fieldcount-1 && $fieldcount>=2){
if($i>0){
$conditionstring.=")";//first condition does not get ending parenthesis.
}
$conditionstring.=" ".$logic[$i]." ";//AND or OR
}
}

//$conditionstring = substr($conditionstring,0,strlen($conditionstring)-5);
//die($conditionstring);

$options = array('conditions' => array($conditionstring));

$i=0;
for($i=0;$i<$fieldcount;$i++){
if($values[$i]!="0"){
if($operators[$i]=="contains"){ //exception for contains because it needs the percentage symbols around the value.
$options['conditions'][] = "%".$values[$i]."%";
}else{
$options['conditions'][] = $values[$i];
}
}
}

//Add any sorts now.
$i=0;
$sortcount = count($sortfields);
$orderstring = '';
for($i=0;$i<$sortcount;$i++){
$orderstring.= $sortfields[$i]." ".$sortdirections[$i].",";
}
$orderstring = rtrim($orderstring,",");//remove trailing comma

$options['order'] = $orderstring;//sets order rules.

//Add any limits now.
if(isset($limit)){
$options['limit']   = $limit;
}
if(isset($offset)){
$options['offset']  = $offset;
}
//die(print_r($options));
return $options;
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]