Ver Mensaje Individual
  #4 (permalink)  
Antiguo 13/04/2012, 10:55
chemajmb
 
Fecha de Ingreso: enero-2012
Ubicación: España
Mensajes: 150
Antigüedad: 12 años, 10 meses
Puntos: 0
Respuesta: Doctrine 2 accediendo a campos de una relacion mediante lazy load

@Masterpuppet
Ok, ahora mismo puse las atributos como protected y parece funcionar mejor que antes, eso me ha hecho cambiar algunos metodos de la clase repositorio para mejor.
( masterpuppet, ¿ me aconsejas trabajar con propiedades implementando los metodos magicos __get y __set o de alguna otra forma para poder escribir en el codigo $var->nombre en vez de $var->getNombre() para acceder a los atributos de las entidades ? )

Masterpuppet, tengo un problemilla, me ha surgido una cosa curiosa, ahora explico.
@maycolalvarez
Si, ya lo se, yo estoy trabajando por ahora con la entidad "categoria" haciendo pruebas hasta que controle un poco del tema y ponerme con el resto de entidades.

Código PHP:
<?php
namespace Entidad
;

use 
DoctrineCommonCollectionsArrayCollection;

/** 
 * @Entity(repositoryClass="Repositorio\categoriaRepositorio")
 * @Table(name="categorias")
 **/
class Categoria
{
    
/** @Id @GeneratedValue(strategy="AUTO") @Column(type="integer") **/
    
protected $id;
    
/** @OneToOne(targetEntity="Categoria", inversedBy="categoriashijo" )
     *  @JoinColumn(name="fkidcategoria", referencedColumnName="id") **/ 
    
protected $categoriapadre;
    
/** @OneToMany(targetEntity="Categoria", mappedBy="categoriapadre") **/
    
protected $categoriashijo;
    
/** @OneToMany(targetEntity="Producto", mappedBy="categoria") **/
    
protected $productos;
    
/** @Column(type="string") **/
    
protected $nombre;
    
/** @Column(type="string") **/
    
protected $urlrelativa;
    
/** @Column(type="text") **/
    
protected $descripcion;
    
/** @Column(type="boolean") **/
    
protected $visible;
    
/** @Column(type="boolean") **/
    
protected $activo;
    
    public function 
__constructCategoria $categoria null )
    {
        if ( 
$categoria instanceof Categoria )
            
$this->setCategoriaPadre$categoria );
        
$this->hijocategorias = new ArrayCollection();
        
$this->productos = new ArrayCollection();
    }

    public function 
setId$valor ){
        
$this->id = (int)$valor;
    }
    public function 
getId(){
        return 
$this->id;
    }
    public function 
setCategoriaPadreCategoria $categoria ){
        
$this->categoriapadre $categoria;
        
$categoria->addCategoriaHijo($this);
    }
    public function 
getCategoriaPadre(){
        return 
$this->categoriapadre;
    }
    public function 
addCategoriaHijoCategoria $categoria ){
        
$this->getCategoriasHijo()->add$categoria );
        
$categoria->setCategoriaPadre$this );
    }
    public function 
getCategoriasHijo(){
        return 
$this->categoriashijo;
    }
    public function 
addProductoProducto $producto ){
        
$this->getProductos()->add($producto);
        
$producto->setCategoria($this);
    }
    public function 
getProductos(){
        
$this->productos;
    }
    
/** resto de geters y seters **/ 
}
?>
Mi clase categoriarepositorio
Código PHP:
<?php
namespace Repositorio
;
 
use 
DoctrineORMEntityRepository;
use 
DoctrineORMQuery;
 
class 
categoriaRepositorio extends EntityRepository{
    
    public function 
dameTodas(){
        
$query $this->_em->createQuery"SELECT partial c.{id, nombre, urlrelativa, descripcion, visible} FROM Entidad\Categoria c, Entidad\Categoria p
                                            WHERE c.categoriapadre = p AND c.id > 1 AND c.activo = 1
                                            ORDER BY p.nombre DESC, c.visible DESC" 
);
        return 
$query->getResult();
    }
    public function 
damePrincipales(){
        
$query $this->_em->createQuery("SELECT partial c.{id, nombre} FROM Entidad\Categoria c, Entidad\Categoria p
                                            WHERE c.categoriapadre = p AND c.activo = true AND p.id = 1
                                            ORDER BY c.nombre ASC"
);
        return 
$query->getResult();
    }
    public function 
dameOrdenadoPor(array $whereparam null, array $orderbyparam null ){
        
$where '';
        
$orderby '';
        if ( isset(
$whereparam) && !empty($whereparam) && is_array($whereparam) ){
            foreach( 
$whereparam AS $akey => $avalue){
                if ( !( 
$avalue === '' ) && !( $avalue === null ) ){
                    if ( 
$akey == 'categoriapadre')
                        
$where .= " AND p.id = $avalue";
                    else
                        
$where .= " AND c.$akey LIKE '$avalue'";
                }
            }
        }else
            throw new 
MiExcepcion('Error en paso de parametros');
        if ( isset(
$orderbyparam) && !empty($orderbyparam) && is_array($orderbyparam) && ( count($orderbyparam) == ) ){
            if (
$orderbyparam[0] === 'categoriapadre')
                
$orderby "ORDER BY p.nombre $orderbyparam[1]";
            else
                
$orderby "ORDER BY c.$orderbyparam[0] $orderbyparam[1]";
        }else
            throw new 
MiExcepcion('Error en paso de parametros');
            
        
$query $this->_em->createQuery"SELECT partial c.{id, nombre, urlrelativa, descripcion, visible} FROM Entidad\Categoria c, Entidad\Categoria p
                                            WHERE c.categoriapadre = p AND c.id > 1 AND c.activo = true$where
                                            $orderby" 
);

        return 
$query->getResult();
    }
    public function 
dameUnoPorId$id ){
        if ( isset(
$id) && !empty($id) && is_int($id) && ($id 1)){
            
$where " AND c.id = $id";
        }
        
$query $this->_em->createQuery"SELECT c FROM Entidad\Categoria c
                                            WHERE c.activo = 1$where"
);

        return 
$query->getSingleResult();
    }
    
}

?>
Resulta que primero me traigo
$this->_vista->catePadres = $this->get('manejador_categoria')->damePrincipales();
luego
$this->_vista->categorias = $this->get('manejador_categoria')->dameOrdenadoPor( $where, $orderby );
var_dump ($this->_vista->categorias);
y resulta que
Código:
...
2 => 
    object(Entidad\Categoria)[142]
      protected 'id' => int 9
      protected 'categoriapadre' => 
        object(Entidad\Categoria)[132]
          protected 'id' => int 1
          ...
      protected 'categoriashijo' => 
        object(Entidad\Categoria)[198]
          ...
      protected 'productos' => 
        object(Doctrine\ORM\PersistentCollection)[145]
              ...
      protected 'nombre' => string 'Sección Gatos' (length=13)
      protected 'urlrelativa' => null
      protected 'descripcion' => null
      protected 'visible' => null
      protected 'activo' => null
  3 => 
    object(Entidad\Categoria)[194]
      protected 'id' => int 5
      protected 'categoriapadre' => 
        object(Entidad\Categoria)[152]
          protected 'id' => int 2
          ...
      protected 'categoriashijo' => 
        object(Doctrine\ORM\PersistentCollection)[188]
             ...
      protected 'productos' => 
        object(Doctrine\ORM\PersistentCollection)[182]
             ...
      protected 'nombre' => string 'Pienso para perros' (length=18)
      protected 'urlrelativa' => string 'pienso' (length=6)
      protected 'descripcion' => string 'Todo tipo de piensos para los perros' (length=36)
      protected 'visible' => boolean true
      protected 'activo' => null
...
resulta que solo me hidrata los valores de los campos id y nombre para la categorias que me he traido con el metodo "damePrincipales()"



Parece como si al ejecutar el metodo "dameOrdenadoPor( $where, $orderby )" me devolviera las referencias de "damePrincipales()" para las entidades que coinciden.
Todas esas categorias tienen valores para urlrelativa y para visible, sin embargo, los valores hidratados son "null".

Última edición por chemajmb; 13/04/2012 a las 11:20