1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
/**
 * Base Class for all the ORM Entity classes
 * @ORM\MappedSuperclass
 *
 * @SuppressWarnings("unused")
 */
class BaseEntity
{

    /**
     * Magic set method
     *
     * @param string $name
     * @param mixed $value
     *
     * @return BaseEntity
     *
     * @throws \RuntimeException
     */
    public function __set($name, $value)
    {
        //enforce some integer properties to be integer,
        //so that doctrine will not report changes to db
        if (in_array($name, $this->integerFields)) {
            $value = intval($value);
        }

        $methodName = 'set'.ucfirst($name);
        if (method_exists($this, $methodName)) {
            $this->$methodName($value);
        } elseif (property_exists($this, $name)) {
            $this->$name = $value;
        } else {
            throw new \RuntimeException("Unable to set the property '$name' on this entity class: " . get_class($this));
        }
        return $this;
    }

    /**
     * Magic get method
     *
     * @param string $name
     *
     * @return mixed
     */
    public function __get($name)
    {
        $methodName = 'get'.ucfirst($name);
        if (method_exists($this, $methodName)) {
            return $this->$methodName();
        }

        if (property_exists($this, $name)) {
            return $this->$name;
        }
        return null;
    }

    protected $attributesToLog = array();
    //this information is used to cast values back to integer
    protected $integerFields = array();

    /**
     * toArray could have a translator, which helps translating values
     * if needed
     *
     * @param Translator $translator
     *
     * @return array
     */
    public function toArray(Translator $translator = null)
    {
        return array();
    }
}


/**
 * @ORM\Entity(repositoryClass="AmMailMessageRepository")
 * @ORM\Table(name="am.am_am_mail_message")
 *
 * @SuppressWarnings(PHPMD)
 */
class AmMailMessage extends BaseEntity
{
 /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(name="id", type="integer", nullable=false)
     */
    protected $id;

    /**
     * @Gedmo\Timestampable(on="create")
     * @ORM\Column(name="createdon", type="datetime")
     */
    protected $createdOn;

    /**
     * @ORM\OneToOne(targetEntity="ConversationMessage")
     * @ORM\JoinColumn(name="id", referencedColumnName="message_id")
     */
    // this field connects to conversations
    protected $conversationMessage;

}



/**
 * @ORM\Entity(repositoryClass="ConversationMessageRepository")
 * @ORM\Table(name="aminno.conversation_messages")
 */
class ConversationMessage extends BaseEntity
{
    /**
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="Conversation", inversedBy="messages")
     * @ORM\JoinColumn(name="conversation_id", referencedColumnName="id")
     */
    protected $conversation;

     /**
     * @ORM\Id
     * @ORM\OneToOne(targetEntity="AmMailMessage")
     * @ORM\JoinColumn(name="message_id", referencedColumnName="id")
     */
    protected $message;

  public function getConversation()
    {
        return $this->conversation; 
    }
}



class Conversation extends BaseEntity
{
    /**
     * @ORM\Column(name="id", type="integer", nullable=false)
     */
    protected $conversationId;

    .....

     public function getConversationId()
    {
        return $this->conversationId;
    }

}


$message = $this->em->find('Entity\AmMailMessage', $messageId);

$message->coversationMessage->conversation->conversationId works

but using $message->coversationMessage->getConversation()->getConversationId() does not