Kdyby/Doctrine jak na update?
- motorcb
- Člen | 552
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
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
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
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
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
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.