Symfony2 entity

A controllerek rész után az entity-k következnek. Doctrine orm használatával kezeljük az entity-ket.

Ha vannak tábláink az adatbázisban, akkor már az ismertetett módon tudunk egyszerűen entity-ket generálni: http://itgyor.com/content/symfony2_hasznalata A példákat egy kicsit megkellett kurtítani, mert túl hosszúak lettek. Két helyen elkellett törni a sort, mert nem fért ki itt a neten.

Ha már van egy bundle-ünk pl:
# php app/console generate:bundle --namespace=Web/NewsBundle

Akkor importáljunk az adatbázisból:
# php app/console doctrine:mapping:import --force WebNewsBundle xml

Ekkor a /src/Web/NewsBundle/Resources/config/doctrine/News.orm.xml fájl jön létre(feltéve ha csak egy News táblánk volt). Ekkor egy xml fájlt fog készíteni a doctrine, a táblák paramétereivel. Ennek a tartalma kb így fog kinézni:
 
<?xml version="1.0" encoding="utf-8"?>
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping
                http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
  <entity name="Web\NewsBundle\Entity\News" table="news">
    <indexes>
      <index name="group" columns="group_id"/>
      <index name="user_id" columns="user_id"/>
    </indexes>
    <id name="id" type="integer" column="id">
      <generator strategy="IDENTITY"/>
    </id>
    <field name="titleHu" type="string" column="title_hu" length="255" nullable="false"/>
    <field name="messageHu" type="text" column="message_hu" length="65535" nullable="false"/>
    <field name="date" type="datetime" column="date" nullable="false"/>
    <field name="status" type="string" column="status" length="100" nullable="false"/>
    <many-to-one field="user" target-entity="Users">
      <join-columns>
        <join-column name="user_id" referenced-column-name="id"/>
      </join-columns>
    </many-to-one>
    <many-to-one field="group" target-entity="NewsGroup">
      <join-columns>
        <join-column name="group_id" referenced-column-name="id"/>
      </join-columns>
    </many-to-one>
  </entity>
</doctrine-mapping>

Ezután a következő parancsot adjuk ki:
# php app/console doctrine:mapping:convert annotation ./src
Ekkor létrejönnek az Entity mappában a fájlok az xml-ekből generálva, elkészül az orm model, pl a News.php néven ilyen generált tartalommal:
 
<?php

namespace Web\NewsBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * News
 *
 * @ORM\Table(name="news", indexes={@ORM\Index(name="group", columns={"group_id"}),
( <- sortörés) @ORM\Index(name="user_id", columns={"user_id"})})
 * @ORM\Entity
 */
class News
{
    /**
     * @var string
     *
     * @ORM\Column(name="title_hu", type="string", length=255, nullable=false)
     */
    private $titleHu;

    /**
     * @var string
     *
     * @ORM\Column(name="message_hu", type="text", length=65535, nullable=false)
     */
    private $messageHu;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="date", type="datetime", nullable=false)
     */
    private $date;

    /**
     * @var string
     *
     *
     * @ORM\Column(name="status", type="string", length=100, nullable=false)
     */
    private $status;

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

    /**
     * @var \Web\NewsBundle\Entity\Users
     *
     * @ORM\ManyToOne(targetEntity="Web\NewsBundle\Entity\Users")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="user_id", referencedColumnName="id")
     * })
     */
    private $user;

    /**
     * @var \Web\NewsBundle\Entity\NewsGroup
     *
     * @ORM\ManyToOne(targetEntity="Web\NewsBundle\Entity\NewsGroup")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="group_id", referencedColumnName="id")
     * })
     */
    private $group;


}
Adjuk ki a következő parancsot amivel legeneráljuk a get/set metódusokat:
# php app/console doctrine:generate:entities WebNewsBundle
 
<?php

namespace Web\News2Bundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * News
 *
 * @ORM\Table(name="news", indexes={@ORM\Index(name="group", columns={"group_id"}),
(<-sortörés) @ORM\Index(name="user_id", columns={"user_id"})})
 * @ORM\Entity
 */
class News
{
    /**
     * @var string
     *
     * @ORM\Column(name="title_hu", type="string", length=255, nullable=false)
     */
    private $titleHu;

    /**
     * @var string
     *
     * @ORM\Column(name="message_hu", type="text", length=65535, nullable=false)
     */
    private $messageHu;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="date", type="datetime", nullable=false)
     */
    private $date;

    /**
     * @var string
     *
     * @ORM\Column(name="status", type="string", length=100, nullable=false)
     */
    private $status;

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

    /**
     * @var \Web\News2Bundle\Entity\Users
     *
     * @ORM\ManyToOne(targetEntity="Web\News2Bundle\Entity\Users")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="user_id", referencedColumnName="id")
     * })
     */
    private $user;

    /**
     * @var \Web\News2Bundle\Entity\NewsGroup
     *
     * @ORM\ManyToOne(targetEntity="Web\News2Bundle\Entity\NewsGroup")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="group_id", referencedColumnName="id")
     * })
     */
    private $group;



    /**
     * Set titleHu
     *
     * @param string $titleHu
     * @return News
     */
    public function setTitleHu($titleHu)
    {
        $this->titleHu = $titleHu;

        return $this;
    }

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

    /**
     * Set messageHu
     *
     * @param string $messageHu
     * @return News
     */
    public function setMessageHu($messageHu)
    {
        $this->messageHu = $messageHu;

        return $this;
    }

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

    /**
     * Set date
     *
     * @param \DateTime $date
     * @return News
     */
    public function setDate($date)
    {
        $this->date = $date;

        return $this;
    }

    /**
     * Get date
     *
     * @return \DateTime
     */
    public function getDate()
    {
        return $this->date;
    }

    /**
     * Set status
     *
     * @param string $status
     * @return News
     */
    public function setStatus($status)
    {
        $this->status = $status;

        return $this;
    }

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

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

    /**
     * Set user
     *
     * @param \Web\News2Bundle\Entity\Users $user
     * @return News
     */
    public function setUser(\Web\News2Bundle\Entity\Users $user = null)
    {
        $this->user = $user;

        return $this;
    }

    /**
     * Get user
     *
     * @return \Web\News2Bundle\Entity\Users
     */
    public function getUser()
    {
        return $this->user;
    }

    /**
     * Set group
     *
     * @param \Web\News2Bundle\Entity\NewsGroup $group
     * @return News
     */
    public function setGroup(\Web\News2Bundle\Entity\NewsGroup $group = null)
    {
        $this->group = $group;

        return $this;
    }

    /**
     * Get group
     *
     * @return \Web\News2Bundle\Entity\NewsGroup
     */
    public function getGroup()
    {
        return $this->group;
    }
}

Ebben a lépésben az előbb készült News.php fájlból készül egy News.php~ fájl és lesz egy új News.php fájl, amiben már benne lesznek a get/set metódusok. Ezzel készen is vagyunk az adatbázisunk orm modeljének elkészítésével ilyen egyszerűen. Generálhatunk crud-ot:
# php app/console generate:doctrine:crud

és ezzel létrejönnek a controllerek, view-ok stb.

Lehetőségünk van arra is, hogy a symfony2-vel módosítsuk az adatbázisban a táblákat. Ehhez Resources/config/doctrine/ mappában kell .orm.xml fájlt kell készítenünk és a hozzátartozó php-s entity fájlt is megkell írnunk az Entity mappában. Ezután kiadhatjuk a következő parancsot:

# php app/console doctrine:schema:update --force

Ezzel módosulnak a tábláink az adatbázisban, ne felejtsük el, hogy a többi generált fájlunk view/controller/stb. is elavult lesz és módosítanunk kell őket, vagy újra legenerálni.

http://symfony.com/doc/current/book/doctrine.html
https://nyukapiszka.wordpress.com/2011/08/06/symfony-2-telepites-bundle-keszites-crud-alapok-es-egyebek-minden-az-egyben/
2014.11.30.