Doctrine2, Mysql, virtuální sloupec rubrika: Databáze: SQL

9 Taco
položil/-a 29.10.2019

Zdravím.

Používám Doctrine2 s MySQL. Mám virtuální sloupec nějak takto:

ALTER TABLE `table`
    ADD `col` decimal(15,5) GENERATED ALWAYS AS (`col1` + `col2`) VIRTUAL;

Metadata mám uložené v yml souborech (deprecated, vím):

    col:
      type: decimal
      precision: 15
      scale: 5
      options:
        generated: (col1 + col2)
        virtuality: virtual
        comment: komentář

Zlobí to, protože to chce ukládat i do tohoto sloupce:

"An exception occurred while executing 'INSERT INTO ...: SQLSTATE[HY000]: General error: 3105 The value specified for generated column 'col' in table 'table' is not allowed."

Poradíte prosím co s tím?

Mé znalosti Doctrine jsou omezené. Takže odhaduji, že buď mám špatně nastavené, nebo by šlo explicitně zakázat ukládat nějaký sloupec, nebo něco jiného.

Předem díky.

odkaz Vyřešeno
9 Taco
odpověděl/-a 1.11.2019
 
upravil/-a 1.11.2019

Tak řešení je ve skutečnosti docela jednoduché.

V prvé řadě musím začít myslet.

Pokud nechci, aby Doctrine ty sloupce ukládala, tak je vůbec nebudu psát do těch metadat. Getter si vytvořit můžu, to jí nevadí, a akorád do něj zduplikuju tu logiku, kterou mám v tom virtuálním sloupci. Tím je splněno, že sloupec v databázi bude, atribut entity taky, a virtuální sloupec se neukládá - vyřešeno.

Komentáře

  • Komanc : Takze "fyzicky" v db ten sloupecek `col` neni? V entite je nejaka metoda, ktera to secte a vrati? Nepocita to teda db (jak by to asi pocitala, kdyby to bylo pres ten ALTER), ale php az v pripade potreby? 1.11.2019
  • Taco : V db ten sloupec je. Co není je ta anotace nad entitou, takže doctrine se na ten sloupec nedívá. Nezkouší ho načíst, ani uložit. Ta logika je tam dvakrát. Jedna v db.column, a druhá v entity.getter. Šlo by to udělat i tak, aby ta logika byla jen v db pomocí eventu, a doplnění do query. Pak by byl opět v enitty getter a setter, a jen díky absence anotace by to Doctirne nechala bejt. 1.11.2019

Pro zobrazení všech 3 odpovědí se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.