Kdyby/Doctrine jak na update?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
motorcb
Člen | 552
+
0
-

Zdravím,

zkouším Kdyby/Doctrine (2.2) a Nette (2.2.7). Vypadá to pěkně :-) Jen se mi nedaří upravit data :-(

$article = $daoArticle->findOneBy( array( "title" => "muj titulek" ) );
dump( $article );exit();
Toto je OK:
   App\Article #f1f9
      id protected => 1
      title protected => "muj titulek"
      name protected => "muj nazev"

Ted chci zmenit name na jiny text:

$article = $daoArticle->findOneBy( array( "title" => "muj titulek" ) );
$article->name = "novy nazev";
$daoArticle->save( $article );

Dostávám chybu:

Doctrine\DBAL\Exception\NotNullConstraintViolationException

An exception occurred while executing 'INSERT INTO article (title, name) VALUES (?, ?)' with params [null, "novy nazev"]: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'title' cannot be null

Jak udělám update záznamu? Díky

chemix
Nette Core | 1310
+
+3
-

Nasel jsem si v google http://symfony.com/…octrine.html#… jak updatovat. Podle tohoto bych chapal, ze mas nastavit jen zmenu a dat flush? ale nejsem zadny doctrine odbornik ani bych se nenazval zacatecnikem :)

$product->setName('New product name!');
$em->flush();
studna
Člen | 181
+
0
-

Ukaž nám PHP kód entity, takto se těžko hádá. Dědíš entitu od Kdyby\Doctrine\Entities\BaseEntity?

studna
Člen | 181
+
0
-

Toto řeší právě řádek

$daoArticle->save( $article );

Ale je lepší používat EntityManager::persist() a EntityManager::flush() viz deprecated EntityDao::save()

Editoval studna (1. 2. 2015 21:51)

motorcb
Člen | 552
+
0
-

Entita vypadá takto:

namespace App;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 */
class Article extends \Kdyby\Doctrine\Entities\BaseEntity
{

    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue
     */
    protected $id;

    /**
     * @ORM\Column(type="string")
     */
    protected $title;

    /**
     * @ORM\Column(type="string", nullable=TRUE)
     * @var string
     */
    protected $name;

}
studna
Člen | 181
+
0
-

Hmm. Před tím, než zavoláš $dao->save($entity), tak v $entity máš opravdu správné hodnoty?

Pokud ano, zkus promazat cache. Pak namísto EntityDao::save($entity) zkus ukládat pomocí EntityManager::persist($entity) a EntityManager::flush($entity).

A pokud ani to nezafunguje, tak si zkus odkrokovat, kde se ti ta entita „ztratí“. Jinak fakt nevim. :-)

Editoval studna (1. 2. 2015 22:47)

Filip Procházka
Moderator | 4668
+
+4
-

Správně takto

$articles = $entityManager->getRepository(Article::class);

// tohle sice bude fungovat, ale asi by bylo lepší hledat podle IDčka, ne?
$article = $articles->findOneBy(["title" => "muj titulek"]);
$article->name = "novy nazev";

$entityManager->flush();

EntityDao a jeho metodu save() jsem musel označit jako @deprecated, protože někteří s tím dělali strašná zvěrstva. Místo aby to používali jenom tam kde se to hodí to narvali všude :(

Ta NotNull výjimka znamená, že nemáš hodnotu pro titulek a tedy databáze odmítá uložit ten řádek.


Fun fact: tohle téma bylo poslední kapkou a donutilo mě vydat nové verze kde už je EntityDao::save() deprecated a opravit dokumentaci.