Pregunta

Estoy tratando de comprobar si el resultado en mi DQL es NULL.

Tengo la siguiente consulta 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;

Ahora quiero comprobar si el s.aantal es NULL por lo que:

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

cuando la variable no es nulo todo funciona, pero cuando en realidad es NULL me sale un mensaje de aviso E:

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

Se ve que es nula, porque aunque si se ejecuta la condición.

Lo extraño es que estoy haciendo exactamente lo mismo en otra página, donde funciona sin problemas. Pero debo estar haciendo algo mal o estúpido ya que esos mensajes generalmente no muestran nada.

Así que ¿alguien puede explicar esto a mí? :)

¿Fue útil?

Solución

Realmente no estoy familiarizado con DQL, pero se podría extender a su estado de if;

if (!is_object($installedbase->Spare) || is_null($installedbase->Spare->spare_id))

Otros consejos

¿Qué tal ....

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

... o tal vez trate de usar la función get_object_vars PHP, algo como:

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

Lo que no estoy tan clara de ello es la forma en que está recibiendo spare_id de s.aantal.

¿Es realmente necesaria para comprobar si es estrictamente nula?

 if ($q) ...

debería ser suficiente para la mayoría de los casos. Echar un vistazo a PHP mesas tipo comparsion .

Además, puede estar interesado en Doctrine_Null:

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

    public function __toString()
    {
        return '';
    }
}

En caso de que no se quedará unirse en i.Spare?

Así que:

$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;

A menos spare_id no es la clave principal que es. Entonces tal vez el cambio de la instrucción de selección a lo que tengo ayuda puede hacerlo a continuación, añadir esto a su prueba:

if(isset($installedbase->Spare) && is_null($installedbase->Spare->spare_id))
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top