-- DorkFest <[EMAIL PROTECTED]> wrote
(on Thursday, 06 November 2008, 05:58 PM -0800):
> This was posted in Dec 2007. I have the same question. Is there anyway using
> fetchAll and setFetchMode to set the explicit class name that's returned in
> the array?
> 
> Or is this a design conflict? Here's basically the situation:
> 
> class Articles extends Zend_Db_Table_Abstract 
> {
>       protected $_name = "articles";
>       protected $_rowClass = "Article";
>       
>       public function fetchActive()
>       {
>               $db = Zend_Registry::get('db');
>               $db->setFetchMode(Zend_Db::FETCH_OBJ);
>               $select = $db->select()
>                       ->from($this->_name)
>                       ->where('active = 1')
>                       ->order('creation_date DESC');
>               // want to return array of articles objects here instead of 
> stdClass
>               return $db->fetchAll($select);
>       }
> }
> 
> class Article extends Zend_Db_Table_Row_Abstract
> {
> }
> 
> Is this the wrong way to approach models? Or is there a better way to obtain
> the fetchAll array of Articles as a return value from the fetchActive()
> method.

Umm... wow... that code is.. wow.

First, when you have a Zend_Db_Table object, you already *have* the
database adapter -- there's no need to grab it from the registry. Next,
Zend_Db_Table also has its own select object now (since 1.5) that
obviates the need to (a) pull it from the database adapter, and (b)
specify the table name (it's automatically populated). Next, fetchAll()
on the adapter already returns an array by default -- it has from the
very beginning. You actually have to override this behavior to get a
different return type by passing the fetchmode as the second parameter to
the call. The reason you're getting anything different is because your
code is calling:

    $db->setFetchMode(Zend_Db::FETCH_OBJ);

which tells the adapter to return fetch results as objects. You're
basically shooting yourself in the foot here.

So, the following will do what you're trying to accomplish:

        public function fetchActive()
        {
                $select = $this->select()
                                   ->where('active = 1')
                                   ->order('creation_date DESC');
                return $this->getAdapter()->fetchAll($select);
        }


> Renan Gonçalves wrote:
> > 
> > Hello,
> > 
> > How I can use fetchAll with fethMode = Object and using the class Article
> > (for example) ?
> > I can use fetchObject('Article') and will fetch on my class, but in
> > fetchAll
> > the default class is stdClass.
> > 
> > The PDOStatement has the function: (
> > http://www.php.net/manual/en/function.PDOStatement-setFetchMode.php)
> > bool *setFetchMode* ( int $PDO::FETCH_CLASS , string $classname , array
> > $ctorargs )
> > 
> > 
> > Best Regards,
> > -- 
> > Renan Gonçalves - Web Developer
> > Cell Phone: +55 (11) 8633-6018
> > MSN: [EMAIL PROTECTED]
> > Web Site: renangoncalves.com
> > São Paulo - SP/Brazil
> > 
> > 
> 
> -- 
> View this message in context: 
> http://www.nabble.com/Zend_Db-tp14140524p20373369.html
> Sent from the Zend Framework mailing list archive at Nabble.com.
> 

-- 
Matthew Weier O'Phinney
Software Architect       | [EMAIL PROTECTED]
Zend Framework           | http://framework.zend.com/

Reply via email to