рд╕рд┐рджреНрдзрд╛рдВрдд ORM рд╡реНрдпрд╡рд╣рд╛рд░, рдпрд╛ рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ рд▓рдХреНрд╖рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ

Php 5.4 рдЬрд╛рд░реА рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╕реЗ рдХреБрдЫ рд╕рдордп рдмреАрдд рдЪреБрдХрд╛ рд╣реИ, рдФрд░ рд╣рдордиреЗ рд▓рдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдФрд░ рдЙрдирдХреЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред Doctrine2 рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

рд▓рдХреНрд╖рдг


Php рдореЗрдВ рд▓рдХреНрд╖рдг рдЧреБрдг рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдПрдХ рд╡рд░реНрдЧ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╡реЗ рджреБрднрд╛рд╖рд┐рдпрд╛ рд╕реНрддрд░ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдбреЙрдХреНрдЯреНрд░рд┐рди рдХреЗ рд▓рд┐рдП рдкрд╛рд░рджрд░реНрд╢реА рд╣реИрдВред

рд▓рдХреНрд╖рдг рдХреНрд╖реИрддрд┐рдЬ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рд╣реИрдВ рдФрд░ рдХрдИ рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рд╡реНрдпрд╡рд╣рд╛рд░ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрджрд░реНрд╢ рд╣реИрдВред

рд╕рд╛рдорд╛рдиреНрдп рд╡реНрдпрд╡рд╣рд╛рд░


рдЕрдХреНрд╕рд░ рд╣рдореЗрдВ create_at рдФрд░ update_at рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдФрд░ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд╕рдордп рдХреЛ рдмрдЪрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдРрд╕реА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ, рд╣рдо рдЦреБрдж рд╕реЗ рдкреВрдЫрддреЗ рд╣реИрдВ: "рдореИрдВ рд╣рд░ рдмрд╛рд░ рдХреЛрдб рдХреЛ рджреЛрд╣рд░рд╛рдиреЗ рд╕реЗ рдХреИрд╕реЗ рдмрдЪ рд╕рдХрддрд╛ рд╣реВрдВ?"

рд╕рдордпрдмрджреНрдз рд╡реНрдпрд╡рд╣рд╛рд░


рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдкреЗрдмрд▓ рдПрдХ рд╕рд░рд▓ рд▓рдХреНрд╖рдг рд╣реИ рдЬрд┐рд╕реЗ рд╕рд┐рджреНрдзрд╛рдВрдд рд╡рд╕реНрддреБрдУрдВ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

<?php use Doctrine\ORM\Mapping as ORM; use Knp\DoctrineBehaviors\ORM as ORMBehaviors; /** * @ORM\Entity */ class Category { use ORMBehaviors\Timestampable\Timestampable; /** * @ORM\Id * @ORM\Column(type="integer") * @ORM\GeneratedValue(strategy="NONE") */ protected $id; } 

рдХрдХреНрд╖рд╛ рдХреЗ рдЕрдВрджрд░ рдЙрдкрдпреЛрдЧ рд╡рд┐рд╡рд░рдг рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред

рдпрд╣ рдХреЛрдб рдбреЗрдЯрдЯрд╛рдЗрдо рдкреНрд░рдХрд╛рд░ рдХреЗ рджреЛ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рд╕рд╛рде рджреЛ рдЧреБрдг рдЬреЛрдбрд╝ рджреЗрдЧрд╛ рдФрд░ createAt рдФрд░ рдЕрджреНрдпрддрд┐рдд рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╡рд┐рдзрд┐рдпрд╛рдБ:

 <?php $category = new Category; $entityManager->persist($category); $category->getCreatedAt(); $category->getUpdatedAt(); 

рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, getUpdatedAt рдЕрдкрдиреЗ рдЕрдВрддрд┐рдо рдЕрдкрдбреЗрдЯ рдХреА рддрд╛рд░реАрдЦ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдЧрд╛ред

рд╕реНрдерд╛рдкрдирд╛


рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдкреЗрдмрд▓ рдФрд░ рдЕрдиреНрдп рд▓рдХреНрд╖рдгреЛрдВ рдХреЛ рдиреЙрдЯрд▓реИрдмреНрд╕ / рдбреЙрдХреНрдЯреНрд░рд┐рдирдмреЗрд╡рд┐рдПрд░реЛ рдХреЗ рдЧреАрдереВрдм рднрдВрдбрд╛рд░ рдореЗрдВ рдПрдХ рд╕рд╛рде рд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЖрдк рд╕рдВрдЧреАрддрдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдиреНрд╣реЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд░реВрдЯ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдХрдВрдкреЛрдЬрд░.рдЬреЛрди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред

 { "require": { "knplabs/doctrine-behaviors": "dev-master", } } 

рдлрд┐рд░ рд╕рдВрдЧреАрддрдХрд╛рд░ рдЪрд▓рд╛рдПрдВ:

 curl -s http://getcomposer.org/installer | php php composer.phar install 

рд╢реНрд░реЛрддрд╛


рдпрд╣ рд╕рдм рдЙрди рд╕рд┐рджреНрдзрд╛рдВрдд рд╢реНрд░реЛрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╡ рд╣реИ рдЬреЛ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдкрдмрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдШрдЯрдирд╛рдУрдВ рдХреЛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдпрд╛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВред

рд▓реЗрдХрд┐рди рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк Symfony2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛! рд╕реЗрд╡рд╛ рдкрд░рд┐рднрд╛рд╖рд╛ рдлрд╝рд╛рдЗрд▓ рдЖрдпрд╛рдд рдХрд░реЗрдВред

 # app/config/config.yml imports: - { resource: ../../vendor/knplabs/doctrine-behaviors/config/orm-services.yml } 

рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╡реНрдпрд╡рд╣рд╛рд░


рдмрд╣реБрдд рдмрд╛рд░, рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЙрди рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдирдХреЗ рдЧреБрдг рдХрдИ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рд╣рдордиреЗ рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ред

рдРрд╕реА рд╡рд╕реНрддреБ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕рдХреЗ рдЧреБрдгреЛрдВ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЖрдкрдХреЛ 2 рдЪрд░рдг рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗред

1. рдЯреНрд░рд╛рдВрд╕рд▓реЗрдЯреЗрдмрд▓ рдЯреНрд░реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ

 <?php use Doctrine\ORM\Mapping as ORM; use Knp\DoctrineBehaviors\ORM as ORMBehaviors; /** * @ORM\Entity */ class Category { use ORMBehaviors\Translatable\Translatable; /** * @ORM\Id * @ORM\Column(type="integer") * @ORM\GeneratedValue(strategy="NONE") */ protected $id; } 

2. рдПрдХ рд╢реНрд░реЗрдгреА рдЕрдиреБрд╡рд╛рдж рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ рдЬреЛ рдЕрдиреБрд╡рд╛рдж рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛:

 <?php use Doctrine\ORM\Mapping as ORM; use Knp\DoctrineBehaviors\ORM as ORMBehaviors; /** * @ORM\Entity */ class CategoryTranslation { use ORMBehaviors\Translatable\Translation; /** * @ORM\Column(type="string") */ protected $name; } 

рд╡рд╣ рд╕рдм рд╣реИ! TranslatableListener рдЕрдкрдиреЗ рдЖрдк рджреЛ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдз рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд▓реЗрдЧреАред рдЖрдк рдирд┐рдпрдорд┐рдд OneToMany рдХрдиреЗрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдЙрдирдХреЗ рд╕рд╛рде рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдЕрдиреБрд╡рд╛рдж рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдИрдВ рдУрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред

 <?php $category = new Category; $category->translate('ru')->setName(''); $category->translate('en')->setName('Shoes'); $em->persist($category); $category->translate('en')->getName(); 

рдкреЗрдбрд╝


рдкреЗрдбрд╝ рдкреЗрдбрд╝реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рднреМрддрд┐рдХ рдкрде рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╕рднреА рдиреЛрдбреНрд╕ рдореЗрдВ рд░реВрдЯ рд╕реЗ рдЕрдкрдирд╛ рдкреВрд░реНрдг рдкрде рд╕рдорд╛рд╣рд┐рдд рд╣реИ:

  | id | name | path | +-----+------------+------------+ | 1 | fr | /1 | | 2 | villes | /1/2 | | 4 | subNantes | /1/2/3/4 | | 7 | en | /7 | | 8 | villes | /7/8 | | 9 | Nantes | /7/8/9 | | 10 | subNantes | /7/8/9/10 | | 11 | Lorient | /7/8/11 | | 12 | Rouen | /7/8/12 | | 6 | Rouen | /1/2/6 | | 3 | Nantes | /1/2/3 | | 5 | Lorient | /1/2/5 | 

рдПрдХ рдкреЗрдбрд╝ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдкрдиреА рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЯреНрд░реА \ Node рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ

 <?php use Doctrine\ORM\Mapping as ORM; use Knp\DoctrineBehaviors\ORM as ORMBehaviors; /** * @ORM\Entity(repositoryClass="CategoryRepository") */ class Category { use ORMBehaviors\Tree\Node; /** * @ORM\Id * @ORM\Column(type="integer") * @ORM\GeneratedValue(strategy="NONE") */ protected $id; } 

рдЗрд╕реА EntityRepository рдореЗрдВ рдЯреНрд░реА / рдЯреНрд░реА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИ:

 <?php use Doctrine\ORM\EntityRepository; use Knp\DoctrineBehaviors\ORM as ORMBehaviors; class CategoryRepository extends EntityRepository { use ORMBehaviors\Tree\Tree; } 

рдЕрдм рдСрдмреНрдЬреЗрдХреНрдЯ рдмрд╛рд▓ рд╡рд╕реНрддреБрдУрдВ, рдорд╛рддрд╛-рдкрд┐рддрд╛, рдЖрджрд┐ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реАрдХреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

 $root = $em->getRepository('Category')->getTree(); $root->getParentNode(); $root->getChildren(); $root[0][1]; // array access of children $root->isLeafNode(); $root->isRootNode(); 


рдирд┐рд╖реНрдХрд░реНрд╖


рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдордиреЗ рд▓рдХреНрд╖рдгреЛрдВ рдХреЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рдХрдИ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХреАред рд╡рд░реНрдгрд┐рдд рд▓рдХреНрд╖рдгреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рдЬреАрдЖрдИрдПрдбреАрдПрдордИ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреАрдердм рдкрд░ рдЙрдирдХреА рдкреВрд░реА рд╕реВрдЪреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдиреЛрдЯред рдпрд╣ рд▓реЗрдЦ рд╣рдорд╛рд░реЗ рдмреНрд▓реЙрдЧ рдкрд░ рдкреНрд░рдХрд╛рд╢рд┐рдд рдПрдХ рд▓реЗрдЦ рдХрд╛ рдПрдХ рд░реВрд╕реА рд╕рдВрд╕реНрдХрд░рдг рд╣реИ: рд╕рд┐рджреНрдзрд╛рдВрдд ORM рд╡реНрдпрд╡рд╣рд╛рд░, рдпрд╛ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рд▓рдХреНрд╖рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ ред рдЕрдВрдЧреНрд░реЗрдЬреА рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓реЗрдЦрдХ: рдХреЙрдиреНрд╕реНрдЯреЗрдВрдЯрд┐рди рдХреБрдбреНрд░реАрдпрд╛рд╢реЛрд╡ (@everzet), рдлреНрд▓реЛрд░рд┐рдпрди рдХреНрд▓реЗрди, рд▓реЗрд╕рдЬрд╝реЗрдХ рдкреНрд░рдмрд╛рдХреАред рдЕрдиреБрд╡рд╛рдж: рдЕрд▓реЗрдХреНрдЬреЗрдВрдбрд░ рдЯреЛрд░реЗрдВрдХреЛ (@torchello)ред

Source: https://habr.com/ru/post/In144802/


All Articles