多対一の単方向関係を持つ 2 つの単純なテーブルがあります。
class Event extends BaseEvent
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
*
* @ORM\ManyToOne(targetEntity="Rposition")
* @ORM\JoinColumn(name="owner", referencedColumnName="id",onDelete="CASCADE", nullable=false )
**/
private $owner;
....
そして所有者フィールド クラスの起源:
class Rposition
{
/**
* @var integer
*
* @ORM\Column(name="id", type="string", length=36)
* @ORM\Id
* @ORM\GeneratedValue(strategy="UUID")
*/
private $id;
/**
*
*
* @ORM\Column(name="scenario", type="string", length=255, nullable=false)
*/
private $scenario;
正しい getter/setter と __tostring() を持つ両方のクラス
次のようなクエリを実装する必要があります。
public function findAllByScenario($scenario) {
$q = $this->getEntityManager()->createQuery("SELECT e , r.scenario , r.id
FROM LapoMymeBundle:Event e
JOIN LapoMymeBundle:Rposition r
WITH e.owner = r.id
WHERE r.scenario = :scenario
ORDER BY e.start ASC, e.end ASC
")->setParameter('scenario', $scenario);
try {
return $q->getResult();
} catch (\Doctrine\ORM\NoResultException $e) {
return null;
}
}
-結合を作成し、その結果を送り返すのは正しい方法ですか?
-オブジェクトの配列からフィールドを取得する正しい方法は何ですか?
そのようなものは次のとおりです。
$events=$this->getDoctrine()->getManager()
->getRepository('LapoMymeBundle:Event')->findAllByScenario($scenario);
$outputUsersArray = Array();
foreach($events as $event)
{
$eventArray = Array();
$eventArray[JSONResponseFields::KEY_ID] = $event->getId();
$eventArray[JSONResponseFields::KEY_NAME] = $event->getOwner()->getId();
$outputEventsArray[] = $eventArray;
} ....
次のようなエラーが発生します。
FatalErrorException: Error: Call to a member function getId() on a non-object in.....