Propel: Call to a member function XXXX on a non-object

Want to write down a simple trick I use to avoid errors like the subject says.

Let’s take we have described tables in our schema.xml:
Listing 1

1
2
3
4
5
6
7
8
9
10
11
12
13
  <table name="User" phpName="User" idMethod="native">
    <column name="id" phpName="Id" peerName="ID" type="INTEGER" required="true" autoIncrement="true" primaryKey="true"></column>
    <column name="username" phpName="UserName" peerName="USERNAME" type="VARCHAR" size="32" required="true" default=""></column>
    <column name="state_id" phpName="StateId" peerName="STATEID" type="INTEGER" required="true" default="0"></column>
    <foreign-key foreignTable="State">
      <reference local="state_id" foreign="id"/>
    </foreign-key>
  </table>
 
  <table name="State" phpName="State" idMethod="native">
    <column name="id" phpName="Id" peerName="ID" type="INTEGER" required="true" autoIncrement="true" primaryKey="true"></column>
    <column name="state_name" phpName="StateName" peerName="NAME" type="CHAR" size="25" required="true" default=""></column>
  </table>

Thanx to relation definition in lines 5-7 we can do a call like this:
Listing 2

1
2
// assuming $user is a valid instance of User
echo $user->getState()->getStateName();

But what happens if a certain user has no `state_id` set for some reason? We’ll get the message: Error: Call to a member function getName() on a non-object…
(Obviously as $user->getState() doesn’t produce a correct State instance without `state_id`)

In case `state_id` isn’t something nitty-gritty in our application we can extend our User class with the following:

Listing 3

1
2
3
4
5
6
7
8
// add this method to propel/build/classes/projectname/User.php
    public function getState() {
        if (parent::getState()) {
            return parent::getState();
        } else {
            return new State();
        }
    }

Et Voila! In case `state_id` value is missing we’ll get an “empty” instance of State with empty fields, Listing 2 will produce nothing.

This entry was posted on Sunday, October 26th, 2008 at 07:44 and is filed under Propel. You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.





Leave a Reply


required


required (will not be published)