Yes, you are correct you don't actually call the user class directly.
Zend_Db_table does that when you have a result object with 1 single row
(normally you have to call results->current() to ensure that you do have a
single row).
Anyways, surely if your current namespace/file system works for the Users
class it should work for the User class. Just make sure whatever naming
convention you have used for the Users class you have used in the User
class.
So if your using Model_DbTable_Users make sure you also use
Model_DbTable_User. It might even be better to have a folder
models/dbRow/User and use Model_DbRow_User. If you did that, however, i
guess you would need to create a custom resource loader in your bootstrap
like:
protected function _initResources()
{
$resourceloader = new Zend_Loader_Autoloader_Resource(array(
'namespace' => ''
'basePath' => APPPLICATION_PATH
));
$resourceloader->addResourceType('model', 'models/', 'Model');
$resourceloader->addResourceType('dbTableModel', 'models/dbTable/',
'Model_DbTable');
$resourceloader->addResourceType('dbTableRow', 'models/dbRow',
'Model_DbRow');
}
Other than that just ensure the class name you use for the $_rowClass is
correct... ie if you did use the resource loader above (and lets assume it
works I havent tested it lol)
$rowClass = 'Model_DbRow_User'
Hope that helps some.
remataklan wrote:
>
> I have two files as you mentioned Users.php and User.php
> If I instantiate User class (like in a line above other), it does so
> without any problem.
> However if I dont and let the job to Users.php to do so. It looks up in
> "Model" directory instead of "Models" and of course cant find the correct
> file.
>
> I'm asking this because you dont instantiate row classes separately in
> your code. (and I dont think you should.)
>
>
> yidarmy2009 wrote:
>>
>> You need to have a file models/dbtable/User.php:
>>
>> class Model_DbTable_User extends Zend_Db_Row_Abstract
>> {
>>
>> }
>>
>> Just to clarify for each table model you need two files - 1 that
>> represents the table object and one that represents the row object (ie
>> where you have a single result object).
>>
>> In the case of users the logical way to name this is Users.php for the
>> table and User.php for the row.
>>
>> This zend_db_table was the way I initially learned to implement sql
>> tables in the zend framework from reading the only two reasonable books I
>> could find on the subject: Zend Framework In Action and Practical Web
>> Applications 2.0 with PHP. Both books used this method and it works so
>> I've never given it a second thought really.
>>
>> I like the way the database is manipulated like an object in the
>> application. The only downside I've really found with it is that
>> sometimes just writing an SQL query seems alot simpler than doing all
>> these models :P
>>
>>
>>
>>
>>
>> remataklan wrote:
>>>
>>> Thanks for the replies.
>>>
>>> I was trying to something very close to your example. However I ran into
>>> problem.
>>>
>>> I am using the autoloader suggested in the quickstart, something like
>>> this
>>>
>>> protected function _initAutoload()
>>> {
>>> $moduleLoader = new Zend_Application_Module_Autoloader(array(
>>> 'namespace' => '',
>>> 'basePath' => APPLICATION_PATH));
>>> return $moduleLoader;
>>> }
>>>
>>> My class name is class Model_DbTable_Users extends
>>> Zend_Db_Table_Abstract
>>> and there is no problem with loading the class.
>>>
>>> However when I set
>>> protected $_rowClass = 'Model_DbTable_User';
>>>
>>> It doesnt load instead throws and exception
>>>
>>> Message: File "Model\DbTable\User.php" does not exist or class
>>> "Model_DbTable_User" was not found in the file
>>> Stack trace:
>>>
>>> #0 C:\Apache2\zf\gifted\library\Zend\Db\Table\Rowset\Abstract.php(119):
>>> Zend_Loader::loadClass('Model_DbTable_U...')
>>> #1 C:\Apache2\zf\gifted\library\Zend\Db\Table\Abstract.php(1223):
>>> Zend_Db_Table_Rowset_Abstract->__construct(Array)
>>> #2 C:\Apache2\zf\gifted\library\Zend\Db\Table\Abstract.php(1177):
>>> Zend_Db_Table_Abstract->fetchAll('((`user`.`id` =...')
>>> #3 C:\Apache2\zf\gifted\application\controllers\ListController.php(23):
>>> Zend_Db_Table_Abstract->find(1)
>>> #4 C:\Apache2\zf\gifted\library\Zend\Controller\Action.php(512):
>>> ListController->userAction()
>>> #5
>>> C:\Apache2\zf\gifted\library\Zend\Controller\Dispatcher\Standard.php(288):
>>> Zend_Controller_Action->dispatch('userAction')
>>> #6 C:\Apache2\zf\gifted\library\Zend\Controller\Front.php(936):
>>> Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http),
>>> Object(Zend_Controller_Response_Http))
>>> #7
>>> C:\Apache2\zf\gifted\library\Zend\Application\Bootstrap\Bootstrap.php(77):
>>> Zend_Controller_Front->dispatch()
>>> #8 C:\Apache2\zf\gifted\library\Zend\Application.php(303):
>>> Zend_Application_Bootstrap_Bootstrap->run()
>>> #9 C:\Apache2\htdocs\gifted\index.php(20): Zend_Application->run()
>>> #10 {main}
>>>
>>> I dont know if its some kind of bug or something I failed to see. Any
>>> help? :)
>>>
>>>
>>>
>>>
>>> yidarmy2009 wrote:
>>>>
>>>> When creating database models using zend_db_table you need to extend to
>>>> abstract classes: zend_db_table_abstract and zend_db_row_abstract.
>>>>
>>>> Take the following simple scenario if you have just a user and a user
>>>> can post many mesages.
>>>>
>>>> so we could have:
>>>>
>>>> user_id {primary key}
>>>> username
>>>> fname
>>>> lname
>>>>
>>>> and
>>>>
>>>> message_id {primary key}
>>>> user_id {foreign key}
>>>> message
>>>> date_time
>>>>
>>>> something like that....
>>>>
>>>> Anyways what you would need then is 4 models like this
>>>>
>>>> class Models_DbTable_Users extends Zend_Db_Table_Abstract
>>>> {
>>>> // this is the table model
>>>> }
>>>>
>>>> class Models_DbTable_User extends Zend_Db_Row_Abstract
>>>> {
>>>> // This is the row model - ie for an individual user or row
>>>> }
>>>>
>>>> class Models_DbTable_Messages extends Zend_db_Table_Abstract
>>>> {
>>>> // messages model
>>>> }
>>>>
>>>> class Models_DbTable_Message extends Zend_Db_Row_Abstract
>>>> {
>>>> // individual message
>>>> }
>>>>
>>>> You then need to do some basic configuration so that Zend_Db_table
>>>> knows how these classes should interact. So we would need to:
>>>>
>>>> class Models_DbTable_Users extends Zend_Db_Table_Abstract
>>>> {
>>>> protected $_name = 'users'; // table name
>>>> protected $_primary = 'user_id'; // primary key field
>>>> protected $_rowClass = 'Models_DbTable_User'; // class name of the
>>>> row class
>>>>
>>>> // Any tables that use the user_id as a foreign key are said to
>>>> be dependent tables
>>>> protected $_dependentTables = array('Models_DbTable_Messages');
>>>> }
>>>>
>>>> We also need to setup the messages model like so:
>>>>
>>>> class Models_DbTable_Messages extends Zend_Db_Table_Abstract
>>>> {
>>>> protected $_name = 'messages'; // table name
>>>> protected $_primary = 'message_id'; // primary key field
>>>> protected $_rowClass = 'Models_DbTable_Message'; // class name of the
>>>> row class
>>>>
>>>> // We use a reference map for foreign keys
>>>> protected $_referenceMap = array(
>>>> 'MessagesByUser' => array( // relationship name
>>>> - can
>>>> be anything you like
>>>> 'columns' => array('user_id'), // column in this
>>>> table that
>>>> holds foreign key
>>>> 'refTableClass' => 'Models_DbTable_Users', //
>>>> Reference Class Model
>>>> 'refColumns' => array('user_id') // reference column -
>>>> primary key
>>>> in the user table
>>>> )
>>>> );
>>>> }
>>>>
>>>> Now we have our basic config out of the way we can implement our own
>>>> methods in the model to keep our controllers as lightweight as possible
>>>> (fat model, thin controller).
>>>>
>>>> If we want to get all messages by a specific user we could do this
>>>>
>>>> class Models_DbTable_User extends Zend_Db_Row_Abstract
>>>> {
>>>> public function getAllMessages()
>>>> {
>>>> return
>>>> $this->findDependentRowSet('Models_DbTable_Messages');
>>>> }
>>>> }
>>>>
>>>> Now, in your controller if you wanted to get all messages by a user you
>>>> would only need to do this:
>>>>
>>>> $users = new Models_DbTable_Users();
>>>> $user = $users->find(10)->current(); // find user with id 10
>>>> $messages = $user->getAllMessages(); // get all messages by user
>>>> $this->view->messages = $messages; // assign to view
>>>>
>>>> Hope this helps a little bit.
>>>>
>>>> Matt
>>>>
>>>> }
>>>>
>>>>
>>>> remataklan wrote:
>>>>>
>>>>> I was trying to understand the quickstart guide on the ZF site.
>>>>>
>>>>> My question is about the model part.
>>>>> First of all a little check to see if I understand the stuff. As I
>>>>> understand Zend_Db_Table handles the stuff with database. The mapper
>>>>> maps this to the model and the model handles everything about getting
>>>>> and setting data. Is this correct?
>>>>>
>>>>> Now the question, is it me or in the end the data we passed to the
>>>>> view is a little bit large. I mean the whole model object is passed to
>>>>> the final view. Is this the correct way to do it?
>>>>>
>>>>> And finally if I wanted to find to all posts from a certain user do I
>>>>> need a new function in the mapper? Something like
>>>>>
>>>>> public function postsByUser($userId)
>>>>> {
>>>>> $resultSet =
>>>>> $this->getDbTable()->fetchAll($this->getDbTable()->select()->where('user_id
>>>>> = ?', $userId));
>>>>>
>>>>> $entries = array();
>>>>> foreach ($resultSet as $row) {
>>>>> $entry = new Model_List();
>>>>> $entry->setId($row->id)
>>>>> ->setEmail($row->email)
>>>>> ->setComment($row->comment)
>>>>> ->setCreated($row->created)
>>>>> ->setMapper($this);
>>>>>
>>>>> $entries[] = $entry;
>>>>> }
>>>>> return $entries;
>>>>> }
>>>>>
>>>>> or is there better way.
>>>>>
>>>>>
>>>>>
>>>>
>>>>
>>>
>>>
>>
>>
>
>
--
View this message in context:
http://www.nabble.com/Zend-Model-and-quickstart-tp23445168p23489705.html
Sent from the Zend Framework mailing list archive at Nabble.com.