Well the namespace/filesystem works for both classes when calling them
directly. The addResourceType works as expected when I instatiate the item
directly. However it seems that when there is another converter somewhere
which converts the directory name as "Model" instead of "Models". But I
cannot seem to find where it is.

I am suspecting it is somewhere:

...\library\Zend\Db\Table\Rowset\Abstract.php(119):
Zend_Loader::loadClass('Model_DbRow_Use...')

I'm still thinking it may be a bug. Because I checked for typos multiple
times. Which version are you using?


yidarmy2009 wrote:
> 
> 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-tp23445168p23490190.html
Sent from the Zend Framework mailing list archive at Nabble.com.

Reply via email to