{"id":88,"date":"2023-01-24T02:10:00","date_gmt":"2023-01-24T01:10:00","guid":{"rendered":"https:\/\/josefnemec.cz\/blog\/?p=88"},"modified":"2024-12-31T10:16:25","modified_gmt":"2024-12-31T09:16:25","slug":"uvod-do-orm-a-jejich-srovnani-doctrine-a-dalsi","status":"publish","type":"post","link":"https:\/\/josefnemec.cz\/blog\/technologie\/uvod-do-orm-a-jejich-srovnani-doctrine-a-dalsi\/","title":{"rendered":"Co je to ORM? Jak ho pou\u017e\u00edtvat a jak\u00e9 jsou jeho v\u00fdhody"},"content":{"rendered":"\n<p>Objektov\u011b rela\u010dn\u00ed mapov\u00e1n\u00ed (ORM) je technika pou\u017e\u00edvan\u00e1 k propojen\u00ed rela\u010dn\u00edch datab\u00e1z\u00ed s objektov\u011b orientovan\u00fdmi programovac\u00edmi jazyky. V PHP se ORM n\u00e1stroje, jako nap\u0159\u00edklad Doctrine, Propel nebo Eloquent, staly ned\u00edlnou sou\u010d\u00e1st\u00ed modern\u00edho v\u00fdvoje aplikac\u00ed. Tento \u010dl\u00e1nek poskytne p\u0159ehled o tom, co ORM znamen\u00e1, jak\u00e9 v\u00fdhody a nev\u00fdhody nab\u00edz\u00ed, a srovn\u00e1 n\u011bkter\u00e9 z nejpopul\u00e1rn\u011bj\u0161\u00edch ORM knihoven v PHP.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Co je ORM?<\/h2>\n\n\n\n<p>ORM umo\u017e\u0148uje v\u00fdvoj\u00e1\u0159\u016fm pracovat s datab\u00e1zemi prost\u0159ednictv\u00edm objekt\u016f nam\u00edsto p\u0159\u00edm\u00e9ho psan\u00ed SQL dotaz\u016f. Mapuje tabulky a sloupce v datab\u00e1zi na t\u0159\u00eddy a vlastnosti v k\u00f3du, \u010d\u00edm\u017e zjednodu\u0161uje interakci mezi aplikac\u00ed a datab\u00e1z\u00ed.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">V\u00fdhody ORM:<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Abstrakce od SQL:<\/strong> V\u00fdvoj\u00e1\u0159i nemus\u00ed ps\u00e1t slo\u017eit\u00e9 SQL dotazy.<\/li>\n\n\n\n<li><strong>Zv\u00fd\u0161en\u00e1 produktivita:<\/strong> ORM zrychluje v\u00fdvoj d\u00edky automatizaci opakuj\u00edc\u00edch se \u00fakol\u016f.<\/li>\n\n\n\n<li><strong>Portabilita:<\/strong> ORM umo\u017e\u0148uje snadno p\u0159en\u00e1\u0161et aplikaci mezi r\u016fzn\u00fdmi datab\u00e1zov\u00fdmi syst\u00e9my.<\/li>\n\n\n\n<li><strong>Bezpe\u010dnost:<\/strong> Pom\u00e1h\u00e1 p\u0159edch\u00e1zet \u00fatok\u016fm, jako je SQL injection.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Nev\u00fdhody ORM:<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>V\u00fdkon:<\/strong> ORM m\u016f\u017ee b\u00fdt pomalej\u0161\u00ed ne\u017e ru\u010dn\u011b psan\u00e9 SQL dotazy.<\/li>\n\n\n\n<li><strong>Slo\u017eitost:<\/strong> Pro slo\u017eit\u011bj\u0161\u00ed dotazy m\u016f\u017ee b\u00fdt ORM m\u00e9n\u011b intuitivn\u00ed.<\/li>\n\n\n\n<li><strong>N\u00e1ro\u010dnost na zdroje:<\/strong> ORM knihovny mohou b\u00fdt t\u011b\u017ekop\u00e1dn\u00e9, pokud nejsou spr\u00e1vn\u011b optimalizov\u00e1ny.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Doctrine ORM<\/h2>\n\n\n\n<p>Doctrine je jedn\u00edm z nejpopul\u00e1rn\u011bj\u0161\u00edch ORM n\u00e1stroj\u016f v PHP. Nab\u00edz\u00ed pokro\u010dil\u00e9 funkce a flexibilitu, d\u00edky \u010demu\u017e je obl\u00edben\u00fd v komunit\u011b v\u00fdvoj\u00e1\u0159\u016f.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Kl\u00ed\u010dov\u00e9 vlastnosti Doctrine:<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Entity Manager:<\/strong> Slou\u017e\u00ed jako hlavn\u00ed br\u00e1na pro pr\u00e1ci s datab\u00e1z\u00ed.<\/li>\n\n\n\n<li><strong>Podpora pokro\u010dil\u00fdch vazeb:<\/strong> Doctrine zvl\u00e1d\u00e1 slo\u017eit\u00e9 relace mezi tabulkami, jako jsou mnoha na mnoho (many-to-many).<\/li>\n\n\n\n<li><strong>P\u0159enositelnost:<\/strong> Doctrine podporuje v\u00edce datab\u00e1zov\u00fdch platforem.<\/li>\n\n\n\n<li><strong>Query Builder:<\/strong> Poskytuje v\u00fdkonn\u00fd n\u00e1stroj pro vytv\u00e1\u0159en\u00ed dynamick\u00fdch dotaz\u016f.<\/li>\n<\/ol>\n\n\n\n<p>Doctrine je popul\u00e1rn\u00ed ORM n\u00e1stroj pro PHP. Poskytuje robustn\u00ed n\u00e1stroje pro mapov\u00e1n\u00ed entit na datab\u00e1zov\u00e9 tabulky a podporuje pokro\u010dil\u00e9 funkce, jako jsou vztahy mezi tabulkami nebo lazy loading.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Uk\u00e1zka pr\u00e1ce s Doctrine &#8211; definice pro modern\u00ed verze PHP(7,8):<\/h4>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>use Doctrine\\ORM\\Mapping as ORM;\n\n#&#91;ORM\\Entity]\n#&#91;ORM\\Table(name: \"products\")]\nclass Product\n{\n    #&#91;ORM\\Id]\n    #&#91;ORM\\GeneratedValue]\n    #&#91;ORM\\Column(type: \"integer\")]\n    private int $id;\n\n    #&#91;ORM\\Column(type: \"string\")]\n    private string $name;\n\n    #&#91;ORM\\Column(type: \"decimal\", precision: 10, scale: 2)]\n    private float $price;\n\n    \/\/ Gettery a settery\n}<\/code><\/pre>\n\n\n\n<p>Dotaz na data:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$product = $entityManager-&gt;find(Product::class, 1);\necho $product-&gt;getName();<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Star\u0161\u00ed verze z\u00e1pisu:<\/h3>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/** @Entity *\/\nclass User {\n    \/** @Id @GeneratedValue @Column(type=\"integer\") *\/\n    private $id;\n\n    \/** @Column(type=\"string\") *\/\n    private $name;\n\n    public function getId() {\n        return $this-&gt;id;\n    }\n\n    public function getName() {\n        return $this-&gt;name;\n    }\n\n    public function setName($name) {\n        $this-&gt;name = $name;\n    }\n}\n\n\/\/ Pou\u017eit\u00ed Entity Manageru\n$user = new User();\n$user-&gt;setName('John Doe');\n$entityManager-&gt;persist($user);\n$entityManager-&gt;flush();\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Dal\u0161\u00ed popul\u00e1rn\u00ed ORM knihovny<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Propel ORM<\/h3>\n\n\n\n<p>Propel je dal\u0161\u00ed zn\u00e1m\u00fd ORM n\u00e1stroj, kter\u00fd nab\u00edz\u00ed leh\u010d\u00ed alternativu k Doctrine. Je vhodn\u00fd pro men\u0161\u00ed projekty nebo tam, kde je d\u016fle\u017eit\u00e1 jednoduchost.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">V\u00fdhody Propelu:<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Snadn\u00e1 konfigurace a pou\u017eit\u00ed.<\/li>\n\n\n\n<li>Podpora automatick\u00e9 generace t\u0159\u00edd z existuj\u00edc\u00ed datab\u00e1ze.<\/li>\n\n\n\n<li>Men\u0161\u00ed n\u00e1roky na v\u00fdkon.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Nev\u00fdhody:<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>M\u00e9n\u011b funkc\u00ed ve srovn\u00e1n\u00ed s Doctrine.<\/li>\n\n\n\n<li>Slab\u0161\u00ed komunita a podpora.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Eloquent ORM<\/h3>\n\n\n\n<p>Eloquent je ORM knihovna pou\u017e\u00edvan\u00e1 v r\u00e1mci Laravel frameworku. Je zn\u00e1m\u00e1 svou jednoduchost\u00ed a intuitivn\u00edm API.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">V\u00fdhody Eloquentu:<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Siln\u00e1 integrace s Laravelem.<\/li>\n\n\n\n<li>Snadn\u00e1 pr\u00e1ce s rela\u010dn\u00edmi daty pomoc\u00ed metod jako <code>hasOne<\/code>, <code>belongsTo<\/code>.<\/li>\n\n\n\n<li>Podpora lazy loadingu.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Nev\u00fdhody:<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Z\u00e1vislost na Laravelu.<\/li>\n\n\n\n<li>M\u00e9n\u011b vhodn\u00fd pro projekty mimo Laravel ekosyst\u00e9m.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Srovn\u00e1n\u00ed<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Vlastnost<\/th><th>Doctrine<\/th><th>Propel<\/th><th>Eloquent<\/th><\/tr><\/thead><tbody><tr><td><strong>Flexibilita<\/strong><\/td><td>Vysok\u00e1<\/td><td>St\u0159edn\u00ed<\/td><td>St\u0159edn\u00ed<\/td><\/tr><tr><td><strong>V\u00fdkon<\/strong><\/td><td>Pr\u016fm\u011brn\u00fd<\/td><td>Lep\u0161\u00ed<\/td><td>Dobr\u00fd<\/td><\/tr><tr><td><strong>Komunita a podpora<\/strong><\/td><td>Siln\u00e1<\/td><td>Slab\u0161\u00ed<\/td><td>Velmi siln\u00e1<\/td><\/tr><tr><td><strong>Jednoduchost<\/strong><\/td><td>N\u00e1ro\u010dn\u011bj\u0161\u00ed<\/td><td>Jednoduch\u00e1<\/td><td>Velmi snadn\u00e1<\/td><\/tr><tr><td><strong>Podpora vazeb<\/strong><\/td><td>Pokro\u010dil\u00e1<\/td><td>Z\u00e1kladn\u00ed<\/td><td>Pokro\u010dil\u00e1<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Kdy pou\u017e\u00edt Doctrine a kdy jinou knihovnu?<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Doctrine:<\/strong> Ide\u00e1ln\u00ed pro komplexn\u00ed aplikace, kde je pot\u0159eba pokro\u010dil\u00e1 pr\u00e1ce s rela\u010dn\u00edmi daty.<\/li>\n\n\n\n<li><strong>Propel:<\/strong> Vhodn\u00fd pro men\u0161\u00ed projekty nebo tam, kde je d\u016fle\u017eit\u00e1 jednoduchost.<\/li>\n\n\n\n<li><strong>Eloquent:<\/strong> Nejlep\u0161\u00ed volba, pokud pou\u017e\u00edv\u00e1te Laravel framework.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Z\u00e1v\u011br<\/h2>\n\n\n\n<p>V\u00fdb\u011br spr\u00e1vn\u00e9ho ORM z\u00e1vis\u00ed na konkr\u00e9tn\u00edch po\u017eadavc\u00edch projektu. Doctrine nab\u00edz\u00ed maxim\u00e1ln\u00ed flexibilitu a pokro\u010dil\u00e9 funkce, ale m\u016f\u017ee b\u00fdt n\u00e1ro\u010dn\u00e9 na u\u010den\u00ed. Propel poskytuje jednoduchost a v\u00fdkon pro men\u0161\u00ed projekty, zat\u00edmco Eloquent je perfektn\u00ed pro ty, kdo se pohybuj\u00ed v ekosyst\u00e9mu Laravel. Bez ohledu na to, kter\u00fd n\u00e1stroj si zvol\u00edte, ORM v\u00e1m umo\u017en\u00ed efektivn\u011bji pracovat s datab\u00e1zemi a soust\u0159edit se v\u00edce na logiku aplikace.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Objektov\u011b rela\u010dn\u00ed mapov\u00e1n\u00ed (ORM) je technika pou\u017e\u00edvan\u00e1 k propojen\u00ed rela\u010dn\u00edch datab\u00e1z\u00ed s objektov\u011b orientovan\u00fdmi programovac\u00edmi jazyky. V PHP se ORM n\u00e1stroje, jako nap\u0159\u00edklad Doctrine, Propel nebo Eloquent, staly ned\u00edlnou sou\u010d\u00e1st\u00ed modern\u00edho v\u00fdvoje aplikac\u00ed. Tento \u010dl\u00e1nek poskytne p\u0159ehled o tom, co<\/p>\n","protected":false},"author":1,"featured_media":27,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[77],"tags":[72,79,75,73,80,71,47,74],"class_list":["post-88","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-technologie","tag-database","tag-doctrine","tag-mssql","tag-mysql","tag-nextras","tag-orm","tag-php","tag-postgrsql"],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/josefnemec.cz\/blog\/wp-content\/uploads\/2024\/12\/465672369_559146400413742_8299140512873852697_n.jpg?fit=928%2C1160&ssl=1","jetpack_sharing_enabled":true,"jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/josefnemec.cz\/blog\/wp-json\/wp\/v2\/posts\/88","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/josefnemec.cz\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/josefnemec.cz\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/josefnemec.cz\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/josefnemec.cz\/blog\/wp-json\/wp\/v2\/comments?post=88"}],"version-history":[{"count":4,"href":"https:\/\/josefnemec.cz\/blog\/wp-json\/wp\/v2\/posts\/88\/revisions"}],"predecessor-version":[{"id":112,"href":"https:\/\/josefnemec.cz\/blog\/wp-json\/wp\/v2\/posts\/88\/revisions\/112"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/josefnemec.cz\/blog\/wp-json\/wp\/v2\/media\/27"}],"wp:attachment":[{"href":"https:\/\/josefnemec.cz\/blog\/wp-json\/wp\/v2\/media?parent=88"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/josefnemec.cz\/blog\/wp-json\/wp\/v2\/categories?post=88"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/josefnemec.cz\/blog\/wp-json\/wp\/v2\/tags?post=88"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}