Black Friday Black Friday
Black Friday výprodej! Až 80 % extra bodů zdarma! Více informací zde

Diskuze: Nette + Kdyby/Doctrine místo update provede insert

PHP Nette Framework Nette framework Nette + Kdyby/Doctrine místo update provede insert

Aktivity (1)
Avatar
dez1nd
Člen
Avatar
dez1nd:25. září 9:15

Ahoj, narazil jsem na problém, na který nemůžu najít řešení. Problém je v tom, že se mi upravená entita nezaktualizuje, ale vytvoří se mi pokaždé nová entita.

Ukládání

/**
 * Metoda pro ukladani
 * @param \Nette\Application\UI\Form $form
 */
public function saveMenu(\Nette\Application\UI\Form $form)
{
        // Vytvoříme si nový objekt menu
        $menu = new \App\Model\Menu();
        // Persistujeme aby s nim mohl em pracovat
        $this->entityManager->persist($menu);
        // Hodnoty formulare
        $values = $form->getForm()->getValues();
        // Pri editaci nastavujeme id
        if(isset($values->id))$menu->setId($values->id);
        // Nalezeni entity rodice dle jeho id
        $parent = $this->entityManager->getRepository(\App\Model\Menu::getClassname())->findOneBy(['id'=>$values->parent_id]);

        $menu->setParentId(empty($parent)?null:$parent);// Nastaveni parent_id
        $menu->setTitle($values->title);// Nastaveni titulku
        $menu->setOrdering($values->ordering); // Nastaveni razeni
        $menu->setDivider($values->divider?true:false); // Nastaveni oddelovace
        $menu->setVisible($values->visible?true:false); // Nastaveni viditelnosti
        $menu->setSource($values->source); // Nastaveni zdroje
        try
        {
                $this->entityManager->flush(); // Ulozime vsechny zmeny do db
                $this->flashMessage("Uloženo", 'success');
                $this->handleResetVars(); // Smazeme vsechny pers. parametry presenteru
        }
        catch (Exception $ex)
        {

        }

}

Objekt

<?php

namespace App\Model;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 */
class Menu extends \Kdyby\Doctrine\Entities\BaseEntity
{
        /**
         * @ORM\Id
         * @ORM\Column(type="integer")
         * @ORM\GeneratedValue
         */
        protected $id;

        /**
         * @ORM\OneToMany(targetEntity="Menu", mappedBy="parent", cascade={"remove"})
         * @ORM\OrderBy({"ordering" = "ASC"})
         */
        protected $children;

        /** @ORM\ManyToOne(targetEntity="Menu", inversedBy="children") */
        protected $parent;

        /** @ORM\Column */
        protected $title;

        /** @ORM\Column(type="boolean", nullable=false) */
        protected $divider;

        /** @ORM\Column(type="integer") */
        protected $ordering;

        /** @ORM\Column(type="boolean", nullable=false) */
        protected $visible;

        /** @ORM\Column(nullable=true) */
        protected $source;


        public function __construct()
        {
                $this->children = new \Doctrine\Common\Collections\ArrayCollection();
        }

        /**
         * Setter pro id
         * @param type $id
         */
        public function setId($id)
        {
                $this->id = $id;
        }

        /**
         * Setter pro rodice
         * @param \App\Model\Menu $menu
         */
        public function setParentId(\App\Model\Menu $menu = null)
        {
                $this->parent = $menu;
        }

        /**
         * Setter pro titulek
         * @param string $title
         */
        public function setTitle(string $title)
        {
                $this->title = $title;
        }

        /**
         * Setter pro razeni
         * @param int $ordering
         */
        public function setOrdering(int $ordering)
        {
                $this->ordering = $ordering;
        }

        /**
         * Setter pro viditelnost
         * @param bool $visible
         */
        public function setVisible(bool $visible)
        {
                $this->visible = $visible;
        }

        /**
         * Setter pro zdroj
         * @param string $source
         */
        public function setSource(string $source)
        {
                $this->source = $source;
        }

        /**
         * Setter pro oddelovac
         * @param bool $divider
         */
        public function setDivider(bool $divider)
        {
                $this->divider = $divider;
        }

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

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

        /**
         * Getter pro razeni
         * @return integer
         */
        public function getOrdering()
        {
                return $this->ordering;
        }

        /**
         * Getter pro id rodice
         * @return integer / null
         */
        public function getParentId()
        {
                return isset($this->parent->id)?$this->parent->id:null;
        }

        /**
         * Getter pro zdroj
         * @return string
         */
        public function getSource()
        {
                return $this->source;
        }

        /**
         * Getter pro oddelovac
         * @return bool
         */
        public function getDivider()
        {
                return $this->divider;
        }

        /**
         * Getter pro viditelnost
         * @return bool
         */
        public function getVisible()
        {
                return $this->visible;
        }

        /**
         * Metoda pro ziskani vsech atributu v podobe pole, kvuli Nette formulari
         * @return array
         */
        public function toArray()
        {
                return [
                        'id' => $this->getId(),
                        'title' => $this->getTitle(),
                        'ordering' => $this->getOrdering(),
                        'parent_id' => $this->getParentId(),
                        'source' => $this->getSource(),
                        'divider' => $this->getDivider(),
                        'visible' => $this->getVisible()
                        ];
        }
}

Dík za pomoc ;)

 
Odpovědět 25. září 9:15
Avatar
dez1nd
Člen
Avatar
dez1nd:25. září 9:26

Ježíší, já jsem slepej. Celou dobu vytvářím nový objekt a nehledám existující. Takto je to správně.

/**
         * Metoda pro ukladani
         * @param \Nette\Application\UI\Form $form
         */
        public function saveMenu(\Nette\Application\UI\Form $form)
        {
                // Hodnoty formulare
                $values = $form->getForm()->getValues();
                // zkusime najit existujici entitu
                $menu = $this->entityManager->getRepository(\App\Model\Menu::getClassname())->findOneBy(['id'=>$values->id]);
                // pokud je hodnota null, vytvoříme si nový objekt menu
                if($menu === null)$menu = new \App\Model\Menu();
                // Persistujeme aby s nim mohl em pracovat
                $this->entityManager->persist($menu);

                // Pri editaci nastavujeme id
                if(isset($values->id))$menu->setId($values->id);
                // Nalezeni entity rodice dle jeho id
                $parent = $this->entityManager->getRepository(\App\Model\Menu::getClassname())->findOneBy(['id'=>$values->parent_id]);

                $menu->setParentId(empty($parent)?null:$parent);// Nastaveni parent_id
                $menu->setTitle($values->title);// Nastaveni titulku
                $menu->setOrdering($values->ordering); // Nastaveni razeni
                $menu->setDivider($values->divider?true:false); // Nastaveni oddelovace
                $menu->setVisible($values->visible?true:false); // Nastaveni viditelnosti
                $menu->setSource($values->source); // Nastaveni zdroje
                try
                {
                        $this->entityManager->flush(); // Ulozime vsechny zmeny do db
                        $this->flashMessage("Uloženo", 'success');
                        $this->handleResetVars(); // Smazeme vsechny pers. parametry presenteru
                }
                catch (Exception $ex)
                {

                }

        }
Akceptované řešení
+5 Zkušeností
Řešení problému
 
Nahoru Odpovědět 25. září 9:26
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 2 zpráv z 2.