Foros del Web » Programando para Internet » PHP » Symfony »

Alguna aplicación de ejemplo con varias relaciones

Estas en el tema de Alguna aplicación de ejemplo con varias relaciones en el foro de Symfony en Foros del Web. Hola gente, estoy aprendiendo symfony, y ahora mismo me he metido con el tema de las relaciones entre entidades, por lo que me gustaría saber ...
  #1 (permalink)  
Antiguo 22/11/2014, 09:42
Avatar de Dundee  
Fecha de Ingreso: junio-2002
Ubicación: El Médano
Mensajes: 1.310
Antigüedad: 21 años, 10 meses
Puntos: 8
Alguna aplicación de ejemplo con varias relaciones

Hola gente, estoy aprendiendo symfony, y ahora mismo me he metido con el tema de las relaciones entre entidades, por lo que me gustaría saber si existe alguna aplicación a modo de EJEMPLO y que sea completita en cuanto a relaciones entre entidades, para poder estudiarlas a fondo.

Gracias.
__________________
Videotutoriales de Drupal
  #2 (permalink)  
Antiguo 24/11/2014, 02:17
Avatar de bNd170  
Fecha de Ingreso: agosto-2009
Ubicación: $this->setLocation('Valencia', 'Spain');
Mensajes: 365
Antigüedad: 14 años, 7 meses
Puntos: 13
Respuesta: Alguna aplicación de ejemplo con varias relaciones

No hay mejores ejemplos y mejor explicados que los de la documentación de Doctrine. La única pega es que está toda en inglés, pero hazte a la idea de que si te vas a dedicar a la programación, el 99% de ésto está en inglés, por lo que no está de más aprender un poquito ;)

Aqui te dejo ejemplos de mapeo básico:
http://doctrine-orm.readthedocs.org/...c-mapping.html

Y mapeo un poco más avanzado con relaciones de tablas de 1:N, N:N, N:1 y demás..
http://doctrine-orm.readthedocs.org/...n-mapping.html
  #3 (permalink)  
Antiguo 24/11/2014, 03:06
Avatar de Dundee  
Fecha de Ingreso: junio-2002
Ubicación: El Médano
Mensajes: 1.310
Antigüedad: 21 años, 10 meses
Puntos: 8
Respuesta: Alguna aplicación de ejemplo con varias relaciones

Cita:
Iniciado por bNd170 Ver Mensaje
No hay mejores ejemplos y mejor explicados que los de la documentación de Doctrine. La única pega es que está toda en inglés, pero hazte a la idea de que si te vas a dedicar a la programación, el 99% de ésto está en inglés, por lo que no está de más aprender un poquito ;)

Aqui te dejo ejemplos de mapeo básico:
http://doctrine-orm.readthedocs.org/...c-mapping.html

Y mapeo un poco más avanzado con relaciones de tablas de 1:N, N:N, N:1 y demás..
http://doctrine-orm.readthedocs.org/...n-mapping.html
Claro compañero, te agradezco el consejo, pero llevo como más de 10 años en el mundo de la programación, y el 99% de lo que leo son documentaciones en inglés, mi pregunta no era por el idioma, simplemente quería saber si existe alguna aplicación (demo) en la que pueda ver ejemplos de relaciones complejas (en inglés mejor que mejor).

Un saludo
__________________
Videotutoriales de Drupal
  #4 (permalink)  
Antiguo 24/11/2014, 03:42
Avatar de bNd170  
Fecha de Ingreso: agosto-2009
Ubicación: $this->setLocation('Valencia', 'Spain');
Mensajes: 365
Antigüedad: 14 años, 7 meses
Puntos: 13
Respuesta: Alguna aplicación de ejemplo con varias relaciones

Si aclaras un poco a que te refieres con relaciones complejas quizás pueda ser de mas ayuda
  #5 (permalink)  
Antiguo 24/11/2014, 05:32
Avatar de Dundee  
Fecha de Ingreso: junio-2002
Ubicación: El Médano
Mensajes: 1.310
Antigüedad: 21 años, 10 meses
Puntos: 8
Respuesta: Alguna aplicación de ejemplo con varias relaciones

Ok, tienes razón, no he sido muy claro.
Por ejemplo estoy intentando montar dos entidades con una relacion oneToMany con una clave primaria composite (es decir compuesta), pero recibo errores por todos los lados, y llevo como dos días viendo ejemplo en San Google pero nada.

Gracias
__________________
Videotutoriales de Drupal
  #6 (permalink)  
Antiguo 24/11/2014, 06:06
Avatar de Delek  
Fecha de Ingreso: marzo-2005
Ubicación: Madrid
Mensajes: 75
Antigüedad: 19 años, 1 mes
Puntos: 0
Respuesta: Alguna aplicación de ejemplo con varias relaciones

Para definir una relación lo que tienes que hacer es declararla en tu entidad.

Por ejemplo:
Código:
    /**
     * @var string
     *
     * @ORM\ManyToOne(targetEntity="Color")
     * @Assert\NotBlank()
     * 
     */
    private $color;
Si lo hiciste así dinos que error te da.
  #7 (permalink)  
Antiguo 24/11/2014, 07:44
Avatar de SirDuque  
Fecha de Ingreso: febrero-2009
Ubicación: Paso del Rey, Buenos Aires, Argentina
Mensajes: 975
Antigüedad: 15 años, 2 meses
Puntos: 89
Respuesta: Alguna aplicación de ejemplo con varias relaciones

Existe la aplicación "cupon" desarrollada como ejemplo para el libro Desarrollo web ágil con Symfony2 escrito por Javier Eguiluz donde te va a enseñar a exprimir Symfony2 y junto con la aplicación "cupon" vas a entender las relaciones entre entidades.

Podes buscar el libro por internet .

Tambien te recomiendo el sitio symfony.es y el libro (manual de 50 pag) buenas practicas Symfony2.

Igual creo que a tu pregunta la mejor guia esta en los links que te cito bNd170

Mucha suerte!
__________________
Mono programando!
twitter.com/eguimariano
  #8 (permalink)  
Antiguo 24/11/2014, 07:55
Avatar de Dundee  
Fecha de Ingreso: junio-2002
Ubicación: El Médano
Mensajes: 1.310
Antigüedad: 21 años, 10 meses
Puntos: 8
Respuesta: Alguna aplicación de ejemplo con varias relaciones

Gracias por tu respuesta, de hecho lo hice así, pero el error que tengo es este:

Código PHP:
Single id is not allowed on composite primary key in entity BranchMainBundleEntityBranch 
Branch.php
Código PHP:
<?php
namespace BranchMainBundleEntity
;
use 
DoctrineORMMapping as ORM;
use 
DoctrineORMQuery;
use 
SymfonyComponentValidatorConstraints as Assert;

/**
 * Book
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="Branch\MainBundle\Entity\BranchRepository")
 */
class Branch {

  
/**
   * @var integer
   *
   * @ORM\Column(name="id", type="integer", nullable=false)
   * @ORM\GeneratedValue(strategy="AUTO")
   * @ORM\Id
   */
  
private $id;

  
/**
   * @var intenger
   * 
   * @ORM\Column(name="book_id", type="integer", nullable=false)
   * @ORM\Id
   * @ORM\ManyToOne(targetEntity="Book", inversedBy="Branch")
   */
  
private $book_id;

  public function 
__construct($id$book_id) {
    
$this->id $id// The branch id.
    
$this->book_id $book_id// The book id.
  
}

  
/**
   * @var integer

   * @ORM\OneToOne(targetEntity="Branch")
   * @ORM\Column(type="integer")
   * @ORM\JoinColumn(name="parent_branch", referencedColumnName="id")
   */
  
private $parent_branch;

  
/**
   * @var string
   * @Assert\NotBlank()
   * @Assert\Length(
   *      min = 10,
   *      max = 500,
   *      minMessage = "Your phrase must be at least {{ limit }} characters long",
   *      maxMessage = "Your phrase cannot be longer than {{ limit }} characters long"
   * ) 
   * @ORM\Column(name="phrase", type="string", length=255)
   */
  
private $phrase;

  
/**
   * @var integer
   * @Assert\NotBlank()
   * @ORM\Column(name="creator_uid", type="integer")
   */
  
private $creatorUid;
    
  
/**
   * @var integer
   *
   * @ORM\Column(name="level", type="integer")
   */
  
private $level;

  
/**
   * Get book_id
   *
   * @return \Branch\MainBundle\Entity\Book 
   */
  
public function getBookId() {
    return 
$this->book_id;
  }

  
/**
   * Set phrase
   *
   * @param string $phrase
   * @return Book
   */
  
public function setPhrase($phrase) {
    
$this->phrase $phrase;

    return 
$this;
  }

  
/**
   * Get phrase
   *
   * @return string 
   */
  
public function getPhrase() {
    return 
$this->phrase;
  }

  
/**
   * Set parentBranch
   *
   * @param integer $parentBranch
   * @return Branch
   */
  
public function setParentBranch($parentBranch) {
    
$this->parentBranch $parentBranch;

    return 
$this;
  }

  
/**
   * Get parentBranch
   *
   * @return integer 
   */
  
public function getParentBranch() {
    return 
$this->parentBranch;
  }

  
/**
   * Set creatorUid
   *
   * @param integer $creatorUid
   * @return Branch
   */
  
public function setCreatorUid($creatorUid) {
    
$this->creatorUid $creatorUid;

    return 
$this;
  }

  
/**
   * Get creatorUid
   *
   * @return integer 
   */
  
public function getCreatorUid() {
    return 
$this->creatorUid;
  }

  
/**
   * Set book_id
   *
   * @param \Branch\MainBundle\Entity\Book $bookId
   * @return Branch
   */
  
public function setBookId(BranchMainBundleEntityBook $bookId null) {
    
$this->book_id $bookId;

    return 
$this;
  }

  public function 
__toString() {
    return 
$this->phrase;
  }

    
/**
     * Set id
     *
     * @param integer $id
     * @return Branch
     */
    
public function setId($id)
    {
        
$this->id $id;

        return 
$this;
    }

    
/**
     * Get id
     *
     * @return integer 
     */
    
public function getId()
    {
        return 
$this->id;
    }

    
/**
     * Set level
     *
     * @param integer $level
     * @return Branch
     */
    
public function setLevel($level)
    {
        
$this->level $level;

        return 
$this;
    }

    
/**
     * Get level
     *
     * @return integer 
     */
    
public function getLevel()
    {
        return 
$this->level;
    }
}
Código PHP:
<?php
[B]
Book.php[/B]
namespace BranchMainBundleEntity;

use 
DoctrineORMMapping as ORM;
use 
DoctrineORMQuery;
use 
DoctrineCommonCollectionsArrayCollection;

/**
 * Book
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="Branch\MainBundle\Entity\BookRepository")
 */
class Book {

  
/**
   * @ORM\OneToMany(targetEntity="Branch", mappedBy="book")
   */
  
protected $branches;

  public function 
__construct() {
    
$this->branches = new ArrayCollection();
  }

  
/**
   * @var integer
   *
   * @ORM\Column(name="id", type="integer")
   * @ORM\Id
   * @ORM\GeneratedValue(strategy="AUTO")
   * @ORM\OneToMany(targetEntity="Branch", mappedBy="Book")
   */
  
private $id;

  
/**
   * @var string
   *
   * @ORM\Column(name="title", type="string", length=255)
   */
  
private $title;

  
/**
   * @var string
   *
   * @ORM\Column(name="description", type="text")
   */
  
private $description;

  
/**
   * @var integer
   *
   * @ORM\Column(name="public", type="integer")
   */
  
private $public;
  
  
  
/**
   * @var integer
   *
   * @ORM\Column(name="maxLevel", type="integer")
   */
  
private $maxLevel;

  
/**
   * Set title
   *
   * @param string $title
   * @return Book
   */
  
public function setTitle($title) {
    
$this->title $title;

    return 
$this;
  }

  
/**
   * Get title
   *
   * @return string 
   */
  
public function getTitle() {
    return 
$this->title;
  }

  
/**
   * Set description
   *
   * @param string $description
   * @return Book
   */
  
public function setDescription($description) {
    
$this->description $description;

    return 
$this;
  }

  
/**
   * @return string 
   */
  
public function getDescription() {
    return 
$this->description;
  }

  
   * 
Set public
   *
   * @
param integer $public
   
* @return Book
   
*/
  public function 
setPublic($public) {
    
$this->public $public;

    return 
$this;
  }

  
/**
   * Get public
   *
   * @return integer 
   */
  
public function getPublic() {
    return 
$this->public;
  }

  
/**
   * Set owner
   *
   * @param integer $owner
   * @return Book
   */
 

  
public function __toString() {
    return 
$this->title;
  }

     * @
param BranchMainBundleEntityBranch $branches
     
* @return Book
     
*/
    public function 
addBranch(BranchMainBundleEntityBranch $branches)
    {
        
$this->branches[] = $branches;

        return 
$this;
    }

    
/**
     * @param \Branch\MainBundle\Entity\Branch $branches
     */
    
public function removeBranch(BranchMainBundleEntityBranch $branches)
    {
        
$this->branches->removeElement($branches);
    }

    
/**
     * @return \Doctrine\Common\Collections\Collection 
     */
    
public function getBranches()
    {
        return 
$this->branches;
    }

    
/**
     * @return integer 
     */
    /**
     * @param integer $maxLevel
     * @return Book
     */
    
public function setMaxLevel($maxLevel)
    {
        
$this->maxLevel $maxLevel;

        return 
$this;
    }

    
/**
     * @return integer 
     */
    
public function getMaxLevel()
    {
        return 
$this->maxLevel;
    }
}

Y el DefaultController.php
Código PHP:
<?php

namespace BranchMainBundleController
;
use 
SymfonyBundleFrameworkBundleControllerController;
use 
BranchMainBundleEntityBranch;
use 
BranchMainBundleEntityBook;
use 
SymfonyComponentHttpFoundationRequest;
use 
SymfonyComponentHttpFoundationResponse;
use 
BranchMainBundleFormPhraseNewPhrase;
use 
BranchMainBundleFormBookNewBook;


// Custom messages.
use BranchMainBundleMessagesMessages;

class 
DefaultController extends Controller {

  public function 
indexAction() {


    return 
$this->render('BranchMainBundle:Default:index.html.twig');
  }

  public function 
createBranchAction(Request $request$book_id$parent_branch_id) {
    
$em $this->getDoctrine()->getManager();
    
$parent_branch $em->getRepository('BranchMainBundle:Branch')->find(array(
     
'id' => $parent_branch_id
     
'book_id' => $book_id
       
));
   
    
$actual_book $em->getRepository('BranchMainBundle:Book')->find($book_id);
    
$em->persist($actual_book);

    
// Create new child branch.
    
$branch = new Branch();
    
$branch->setPhrase('Write a blog post');
    
$branch->setParentBranch($parent_branch);
    
$branch->setBookId($actual_book);
    
// $book->setDueDate(new \DateTime('tomorrow'));
    
$branch->setCreatorUid(1);

    
$form $this->createForm(new NewPhrase(), $branch);
    
$form->handleRequest($request);

    if (
$form->isValid()) {
      
// Save new branch in db.

      
$em $this->getDoctrine()->getManager();
      
$em->persist($branch);
      
$em->flush();

      
//return $this->redirect($this->generateUrl('task_success'));
      
$Message = new Messages;
      return 
$Message->successAction();
    }
    
// Default view.
    
return $this->render('BranchMainBundle:Default:new_branch.html.twig', array(
          
'form' => $form->createView(),
    ));
  }



}
__________________
Videotutoriales de Drupal
  #9 (permalink)  
Antiguo 24/11/2014, 07:57
Avatar de SirDuque  
Fecha de Ingreso: febrero-2009
Ubicación: Paso del Rey, Buenos Aires, Argentina
Mensajes: 975
Antigüedad: 15 años, 2 meses
Puntos: 89
Respuesta: Alguna aplicación de ejemplo con varias relaciones

En principio deberías usar en el constructor los "seters" y en la entidad quitar GeneratedValue ya la seteas a mano.
__________________
Mono programando!
twitter.com/eguimariano
  #10 (permalink)  
Antiguo 24/11/2014, 08:03
Avatar de Dundee  
Fecha de Ingreso: junio-2002
Ubicación: El Médano
Mensajes: 1.310
Antigüedad: 21 años, 10 meses
Puntos: 8
Respuesta: Alguna aplicación de ejemplo con varias relaciones

Cita:
Iniciado por SirDuque Ver Mensaje
En principio deberías usar en el constructor los "seters" y en la entidad quitar GeneratedValue ya la seteas a mano.
Gracias por tu respuesta, pero entiendo cuando dices que quite el generatevalue que te refieres a este "* @ORM\GeneratedValue(strategy="AUTO")". Lo que sucede es que si lo quito me cargo el auto.incremente , y yo no quiero eso, ya que las ids cuando se crean nuevas entidades branch, deben de tener un Id automática.

Gracias
__________________
Videotutoriales de Drupal
  #11 (permalink)  
Antiguo 24/11/2014, 08:10
Avatar de SirDuque  
Fecha de Ingreso: febrero-2009
Ubicación: Paso del Rey, Buenos Aires, Argentina
Mensajes: 975
Antigüedad: 15 años, 2 meses
Puntos: 89
Respuesta: Alguna aplicación de ejemplo con varias relaciones

Perdón me quede con "claves compuestas"

En ese caso quita @ORM\Id de $book_id ya que es un FK y no un Primary de la entidad Branch.

Y del constructor quita $this->id = $id


Saludos
__________________
Mono programando!
twitter.com/eguimariano
  #12 (permalink)  
Antiguo 24/11/2014, 08:18
Avatar de Dundee  
Fecha de Ingreso: junio-2002
Ubicación: El Médano
Mensajes: 1.310
Antigüedad: 21 años, 10 meses
Puntos: 8
Respuesta: Alguna aplicación de ejemplo con varias relaciones

Cita:
Iniciado por SirDuque Ver Mensaje
Perdón me quede con "claves compuestas"

En ese caso quita @ORM\Id de $book_id ya que es un FK y no un Primary de la entidad Branch.

Y del constructor quita $this->id = $id


Saludos
No lo entiendo bien, pero aún así sale con error:
Versión reducido Xd.
Código PHP:
class Branch {

  
/**
   * @var integer
   *
   * @ORM\Column(name="id", type="integer", nullable=false)
   * @ORM\GeneratedValue(strategy="AUTO")
   * @ORM\Id
   */
  
private $id;

  
/**
   * @var intenger
   * 
   * @ORM\Column(name="book_id", type="integer", nullable=false)
   * @ORM\ManyToOne(targetEntity="Book", inversedBy="Branch")
   */
  
private $book_id;

  public function 
__construct($book_id) {
    
//$this->id = $id; // The branch id.
    
$this->book_id $book_id// The book id.
  
}

Versión reducida de controller.
Código PHP:
  public function createBranchAction(Request $request$book_id$parent_branch_id) {

    
$em $this->getDoctrine()->getManager();

    
$parent_branch $em->getRepository('BranchMainBundle:Branch')->find(array(
     
'id' => $parent_branch_id
     
'book_id' => $book_id
       
));

    
// Actual book 
    
$actual_book $em->getRepository('BranchMainBundle:Book')->find($book_id);
  
    
// Presist book
    
$em->persist($actual_book);


El constructor no debe llevar las dos propiedades que forman la calve primaria Id + BookId ?. Book_id no es ningun Foreign Key sino parte de la calve primaria compuesta.

La verdad que estoy un poco hecho un lío.

Gracias de antemano.
__________________
Videotutoriales de Drupal
  #13 (permalink)  
Antiguo 24/11/2014, 08:24
Avatar de SirDuque  
Fecha de Ingreso: febrero-2009
Ubicación: Paso del Rey, Buenos Aires, Argentina
Mensajes: 975
Antigüedad: 15 años, 2 meses
Puntos: 89
Respuesta: Alguna aplicación de ejemplo con varias relaciones

Buen en principio no veo utilidad de crear una clave primaria compuesta, si una de ellas es AUTO INCREMENT.
La clave primaria deber ser UNICA y el AUTO INCREMENT cumple esa regla.

$book_id es una FK que apunta a la entidad Book, lo indicaste vos en la anotación de dicha propiedad.
Código PHP:
Ver original
  1. /**
  2.    * @var intenger
  3.    *  
  4.    * @ORM\Column(name="book_id", type="integer", nullable=false)
  5.    * @ORM\ManyToOne(targetEntity="Book", inversedBy="Branch")
  6.    */
  7.   private $book_id;

El constructor se utiliza para ejecutar acciones, no para setear valores, las entidades la maneja el ORM Doctrine.

Si vos queres buscar el Branch y solo tenes el book_id lo haces de la siguiente manera:


$actual_book = $em->getRepository('BranchMainBundle:Book')->find($book_id);
$parent_branch = $em->getRepository('BranchMainBundle:Branch')->find( $actual_book );
__________________
Mono programando!
twitter.com/eguimariano

Última edición por SirDuque; 24/11/2014 a las 08:26 Razón: Me equivoque al llamar parent_branch
  #14 (permalink)  
Antiguo 24/11/2014, 08:30
Avatar de Dundee  
Fecha de Ingreso: junio-2002
Ubicación: El Médano
Mensajes: 1.310
Antigüedad: 21 años, 10 meses
Puntos: 8
Respuesta: Alguna aplicación de ejemplo con varias relaciones

Cita:
Iniciado por SirDuque Ver Mensaje
Buen en principio no veo utilidad de crear una clave primaria compuesta, si una de ellas es AUTO INCREMENT.
La clave primaria deber ser UNICA y el AUTO INCREMENT cumple esa regla.

$book_id es una FK que apunta a la entidad Book, lo indicaste vos en la anotación de dicha propiedad.
Código PHP:
Ver original
  1. /**
  2.    * @var intenger
  3.    *  
  4.    * @ORM\Column(name="book_id", type="integer", nullable=false)
  5.    * @ORM\ManyToOne(targetEntity="Book", inversedBy="Branch")
  6.    */
  7.   private $book_id;

El constructor se utiliza para ejecutar acciones, no para setear valores, las entidades la maneja el ORM Doctrine.

Si vos queres buscar el Branch y solo tenes el book_id lo haces de la siguiente manera:

$parent_branch = $em->getRepository('BranchMainBundle:Branch')->find( $book_id );
Ok una vez más creo que no me he sabido explicar.

La clave compuesta creía que era necesaria, pero te tendría que enseñar para ello el modelo entidad relación y el esquema de la aplicación que quiero hacer.

Básicamente quiero que la Id única de cada rama la formen su Id + Book_id, una vez que se crea una rama nueva, esta coge los datos del Book al que pertenece y añade una tupa en la Bd con un Id (autoincrement) y un Book_id dado por la aplicación. Pero ahora que lo pienso igual lo que dices tienes razón, ¿para qué un autoincrement si es compuesta? , jejje que lío. Tengo que darle un vuelta a esto. El book_id tendría que ser más bien como bien dices un FK.

Gracias
__________________
Videotutoriales de Drupal

Etiquetas: alguna, ejemplo, relaciones
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:38.