sql >> Databáze >  >> RDS >> Mysql

PDO::FETCH_CLASS s více třídami

Protože neznáte typ (název třídy) vrácených objektů, než provedete dotaz, nemůžete jej specifikovat.

Tuto logiku však můžete zapouzdřit do jiného typu, který používáte jako návratový typ, který pak může vrátit konkrétní návratový typ:

/**
 * Should not have any private, public or protected members in it's definition.
 * 
 * Does only work for public properties.
 */
class ReturnObject {
    public function getConcrete()
    {
        /* decide here which class */
       $classname = 'Child'; // or 'Adult'

       return $this->selfAs($classname);
    }

    private function selfAs($classname)
    {
        $l = strlen(__CLASS__);
        $s = sprintf('O:%d:"%s"', strlen($classname), $classname).substr(serialize($this), 5+strlen($l)+$l);
        $instance = unserialize($s);
        $instance->__construct();
        return $instance;
    }
}

Poté můžete použít getConcrete() funkce na každém vráceném objektu vrátit váš konkrétní typ, vaše rozhodovací logika je vázaná na návrat databáze.

Upravit: Změnil jsem to na verzi, která nejprve inicializuje vlastnosti objektů pomocí unserialize (prosím otestujte, zda to funguje, je to založeno na předpokladu, že mluvíme pouze o veřejných vlastnostech a nevím, zda PDO dělá pouze nastavovače nebo více přes odraz v režimu, který používáte) a poté zavolá funkci konstruktoru. Aby to fungovalo, konstruktor musí být veřejný (a musí existovat).

Technicky je možné to zpřístupnit i soukromým a chráněným členům, ale to vyžaduje skutečnou reflexi a také vyžaduje analýzu serializovaných dat. Tato třída pouze přejmenuje název třídy, ale ne uvnitř soukromých vlastností.

Toto je však pouze jeden způsob, jak toho dosáhnout. Pravděpodobně potřebujete pouze ->isChild() nebo ->isAdult() funkce na vaší Person třída.



  1. Spring Batch - JdbcCursorItemReader hází OutOfMemoryError s velkou tabulkou MySQL

  2. Vyberte z mysql vloženého do proměnné VB.NET

  3. UPDATE syntaxe pomocí ORDER BY, LIMIT a Multiple Tables

  4. meta_query, jak hledat pomocí vztahu OR &AND?