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.