@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 __construct( Categoria $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 setCategoriaPadre( Categoria $categoria ){
$this->categoriapadre = $categoria;
$categoria->addCategoriaHijo($this);
}
public function getCategoriaPadre(){
return $this->categoriapadre;
}
public function addCategoriaHijo( Categoria $categoria ){
$this->getCategoriasHijo()->add( $categoria );
$categoria->setCategoriaPadre( $this );
}
public function getCategoriasHijo(){
return $this->categoriashijo;
}
public function addProducto( Producto $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) == 2 ) ){
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".