Ayuda con Zend y SQL

radykal

Buenas,

Desde hace tiempo que mi puesto de trabajo cuelga de un hilo (mucha crisis, muchos morosos y poco trabajo...) así que me he puesto a aprender Zend ya que he visto bastantes ofertas de trabajo donde se precisa, para ello estoy migrando mi blog (que aún no estaba ni acabado) a Zend FrameWork MVC (versión 2, que aún no es definitiva pero ya está con las rc's) así aprendo mientras hago algo productivo en un ejemplo real.

Así que como me van surgiendo dudas, intento buscarme la vida con ejemplos y leyendo la documentación (el problema es que la doc aún no está del todo acabada para esta versión).

Acabo de pasarme dos malditas horas peleándome con una gilipollez... al final lo he conseguido pero como no acabo de entender bien lo que he hecho a ver si alguien me puede hacer lo mismo con un código más fácil.

Esta primera función está sacada del tutorial oficial de ZF2 (adaptado al blog, originalmente era para un álbum), sirve para listar los 10 últimos posts (para la portada):

public function listAll()
    {
        $resultSet = $this->select(function (Select $select) {
            $select->join('users','blog_posts.id_user = users.id',array('name'))
                   ->order('date DESC')
                   ->limit(10);
        });
        return $resultSet;
    }

Eso funcionó sin más, añadí el join que necesitaba para recuperar el nombre del usuario y ya está.

El que me trae de cabeza es la siguiente, quería la función que devolviese sólo 1 post especificándole la url-key (friendlyname), el ejemplo más simple que encontré era así:

public function getPost($idname)
    {
        $rowset = $this->select(array('idname' => $idname));
        return $rowset;
        
}

El cual funcionaba pero tenia el problema que le faltaba el join para mostrarme el nombre del usuario. Tras las 2 horas de desesperación y probar todo lo posible he acabado con la siguiente función la cual funciona

public function getPost($idname)
    {
        $resultSet = $this->select(function (Select $select) use ($idname) {
            $select->join('users','blog_posts.id_user = users.id',array('name'))
                    ->where(array('idname' => $idname));
        });
        return $resultSet;
    }

Lo primero que probé fue esa misma función pero me faltaba el use ($idname) por lo que no me reconocia la variable $idname dentro de la segunda función esa, que es exactamente lo que no entiendo... alguien puede explicar para dummies la linea:

$this->select(function (Select $select)

Yo entiendo que sirve para instanciar la clase Select, dentro de los corchetes asignas lo que te interesa en esa clase y su resultado devuelto se asigna al $this->select.

Y si se puede escribir de una forma menos complicada, tipo hacer la clase antes y luego asignarla al resultset que me interesa... y me podeis poner el código de ejemplo estaré eternamente agradecido.

Muchas gracias y perdonad el tocho.

Usuarios habituales

  • radykal