views:

128

answers:

3

I don't get it how it really works. I have a database table user and a model User:

<?php
class User extends Zend_Db_Table_Abstract {
    protected $_name = 'users';
}

And in the controller I call it: $user = new User() But how do I get for example all users or a user with the id: 1?

A: 

Try creating a static method in your User class that returns an array of all users.

Andrew G. Johnson
+1  A: 

Are you looking for $user->find()?

Also, Zend_Db_Table != Model. You can read more about the M of MVC here:

Richard Nguyen
+6  A: 

Zend_Db_Table implements the Table Gateway pattern and the associated Zend_Db_Table_Row implements the Row Data Gateway pattern.

This means that as the table class represents your database table, it makes more sense to use a plural class name. Similarly, a singular class name should be used for the row class.

Hence you end up with something like this:

class Model_Users extends Zend_Db_Table_Abstract
{
    protected $_name = 'users';           // database table name
    protected $_rowClass = 'Model_User';  // row class name

    public function fetchAllInLastNameOrder()
    {
        return $this->fetchAll(null, array('last_name', 'first_name'));
    }

    public function fetchUserById($id)
    {
        return $this->_fetchRow('id = '. (int)$id);
    }
}

class Model_User extends Zend_Db_Table_Row_Abstract
{
    public function getFullName()
    {
        return trim($this->title . ' ' 
                . $this->first_name . ' ' 
                . $this->last_name);
    }
}

The point of creating your own classes is that you can add your own methods that your controllers and views can then use. You should never use the Zend_Db_Table methods directly other than in your model classes. This is because this model design is tightly coupled to the database implentation. Over time, you may find that this isn't flexible enough and want to use a different system. If you have ensured that the rest of your application only ever accesses methods created in Model_Users and Model_User then you should be able to reimplement your model without breaking the rest of your app...

For larger applications and ones with complex business logic, it is rare for a model to be a simple wrapper over a single database table. For better flexibility and maintainability, you can consider creating models which are simple classes and then using a mapper class that maps from the model to the database. This is explored by Matthew Weier O'Phinney in his talk Architecting Your Models, which I highly recommend looking at.

Also, for ideas on how to use the model from within the controller, the Quick Start or my tutorial are good starting points.

Rob Allen
Thank you Rob Allen for this detailed and useful answer!