Проверьте, является ли результат гидратированной доктрины NULL

Я пытаюсь проверить, является ли результат в моем DQL NULL.

Я получил следующий запрос DQL:

    $q = self::createQuery("l")
        ->select('i.*, s.aantal, m.naam, c.cat_naam, a.app_id')
        ->from('InstalledBase i, i.Spare s, i.Apparaat a, a.Categorie c, a.Merk m')
        ->execute();

    return $q;

Теперь я хочу проверить, является ли s.aantal NULL, поэтому я делаю:

if(is_null($installedbase->Spare->spare_id))

когда переменная НЕ равна нулю, все работает, но когда она на самом деле равна NULL, я получаю уведомление E:

Notice: Trying to get property of non-object in \installedbase\templates\_index.php on line 29

Однако он видит, что он равен нулю, потому что выполняется условие if.

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

Так кто-нибудь может мне это объяснить? :)


person iggnition    schedule 09.06.2010    source источник


Ответы (4)


Я действительно не знаком с DQL, но вы можете расширить свой оператор if до;

if (!is_object($installedbase->Spare) || is_null($installedbase->Spare->spare_id))
person TheDeadMedic    schedule 09.06.2010
comment
не работает к сожалению, вот только добавляет еще одно точно такое же уведомление :( - person iggnition; 09.06.2010
comment
Сделайте еще один шаг назад — добавьте !is_object($installedbase) || к оператору if. - person TheDeadMedic; 09.06.2010
comment
тоже не работает, я действительно не понимаю, почему is_null вообще не работает, он отлично работает на другой странице:/ - person iggnition; 09.06.2010
comment
Проблема не в is_null(), а в том, что либо $installedbase, либо $installedbase->Spare не является объектом. Вы пытаетесь получить доступ к свойству чего-то, что не является объектом, отсюда и ошибка. Вы разместили дополнительные is_object в начале if? - person TheDeadMedic; 09.06.2010
comment
Комментарий выше правильный... когда отношение не существует, Spare не является объектом, поэтому вы не можете получить доступ к его свойству. Вам нужно либо изменить то, что возвращает запрос, либо добавить какую-то проверку перед вызовом is_null. - person Tom; 09.06.2010

Как насчет....

if(isset($installedbase->Spare->spare_id)) {
  if(is_null($installedbase->Spare->spare_id)) {
    // do something
  }
}

... или, может быть, попробуйте использовать функцию PHP get_object_vars, что-то вроде:

if(!empty(get_object_vars($installedbase->Spare)) && is_null($installedbase->Spare->spare_id)) {
  // do something
  }

Что мне не совсем понятно, так это то, как вы получаете spare_id от s.aantal.

person Tom    schedule 09.06.2010

Действительно ли нужно проверять, является ли оно строго нулевым?

 if ($q) ...

должно быть достаточно для большинства случаев. Взгляните на таблицы сравнения типов PHP.

Также вас может заинтересовать Doctrine_Null:

final class Doctrine_Null
{ 
    public function exists()
    {
        return false;    
    }

    public function __toString()
    {
        return '';
    }
}
person takeshin    schedule 09.06.2010

Разве вы не должны присоединиться к i.Spare?

So:

$q = self::createQuery("l")
        ->select('i.*, s*, m.naam, c.cat_naam, a.app_id')
        ->from('InstalledBase i')
        ->leftJoin('i.Spare s')
        ->innerJoin('i.Apparaat a, a.Categorie c, a.Merk m')
        ->execute();

return $q;

Если только spare_id не является первичным ключом. Тогда, возможно, изменение оператора select на то, что я сделал, может помочь, а затем добавить это в ваш тест:

if(isset($installedbase->Spare) && is_null($installedbase->Spare->spare_id))
person johnwards    schedule 12.06.2010