Doctrine problem s ENUM → „Unknown database type enum requested“
- xrep
- Člen | 51
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
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
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
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
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.
- Filip Procházka
- Moderator | 4668
@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.