Doctrine problem s ENUM → „Unknown database type enum requested“

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

Ahoj,

implementoval jsem do meho projektu doctrine skrze Kdyby. Vyuzival jsem enum timhle zpusobem:

/**
 * @ORM\Column(type="string", columnDefinition="enum('draft', 'published')")
 */
protected $status;

Po upgradu skrze composer update mi najednou pise:

[Doctrine\DBAL\DBALException]
Unknown database type enum requested, Doctrine\DBAL\Platforms\MySqlPlatform may not support it.

Trochu jsem googlil, resenim je pry zaregistrovat enum jako string

$conn = $em->getConnection();
$conn->getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'string');

Kam ten kus kodu narvat?

Zkousel jsem pridat do config.local.neon

mapping_types:
enum: string

do sekce doctrine ale bez uspechu.

studna
Člen | 181
+
0
-

Mrkni tady https://github.com/…xtension.php#L81

EDIT: Máš tam jinou chybku, ENUM musí být uppercase. A mělo by to fungovat.

/** @Column(type="string", columnDefinition="ENUM('a', 'b')") */
	private $type;

Ale ještě lepší bude, když se rozhodneš typ ENUM nepoužívat vůbec. :-)

Editoval studna (6. 3. 2015 15:59)

Filip Procházka
Moderator | 4668
+
0
-

No napadlo by tě, že když chceš aby sloupeček byl typu enum, tak musíš do property type napsat enum a né string? :)

/**
 * @ORM\Column(type="enum", columnDefinition="enum('draft', 'published')")
 */
protected $status;
studna
Člen | 181
+
-1
-

Filip Procházka napsal(a):

No napadlo by tě, že když chceš aby sloupeček byl typu enum, tak musíš do property type napsat enum a né string? :)

/**
 * @ORM\Column(type="enum", columnDefinition="enum('draft', 'published')")
 */
protected $status;

Když definuje ENUM na úrovni databáze, tak type="string" je správně. Ne?

xrep
Člen | 51
+
0
-

Díky za reakce,

prozatím jsem to přepsal dle http://doctrine-orm.readthedocs.org/…l-enums.html // „Solution 1“

Studna:
puvodne to fungovalo s columdefinition=„Enum(…“ pak jsem daval velke i male, chyba tam byla stale. Ale mozna jsem zapomel smazat cache.

Urcite na to jeste mrknu a dam vedet, totiz puvodni reseni s MYSQL ENUM mi prislo velmi jednoduche na spravu / rozsiritelnost a semanticcejsi nez tam cpat stringy ktere se kontroluji na strane modelu.

studna
Člen | 181
+
0
-

Ano, musíš smazat cache. Pak si ověř, že je schema opravdu validní: php www/index.php orm:validate-schema.

Ale používat ENUM na úrovni databáze opravdu nedoporučuji. Raději si vytvoř další tabulku jako číselník stavů.

Editoval studna (6. 3. 2015 18:24)

Filip Procházka
Moderator | 4668
+
+6
-

@studna pokud chceš aby správně fungoval schema manager, tak bys měl použít především správný typ pro metadata. Tedy type="enum".

Správně například takto

	/**
	 * @ORM\Column(type="enum", columnDefinition="enum('cs','en','sk') DEFAULT 'cs' NOT NULL")
	 * @var string
	 */
	protected $locale;

To ovšem nic nemění na tom, že enumy v MySQL jsou sračka a extrémně nedoporučuji je používat. Takový alter nad orders s miliony záznamů, jenom abys tam přidal další hodnotu pro enum nad stavy v jakých může objednávka být je lahoda (sarcasm alert: trvá to tisíc let).

Raději používej stringy a konstanty na entitách a ignoruj že v MySQL existuje enum.