絵画を参照して販売する symfony2 アプリケーションには、次の 2 つのオブジェクトがあります。
- すべての絵画は絵画のインスタンスです
- それらのいくつかは売りに出されています。オークションのインスタンスをそれらに関連付けます
この 2 つの間に OneToMany 関係があり、ペイントによってマッピングされます。
私の問題 :
// In Controller.php
public function homepageListAction()
{
$paintings = $this->getPaintingRepository()->findPaintingsForHomepage();
$auctions = $this->getPaintingRepository()->findAuctionsForHomepage();
foreach($paintings as $painting)
{
$painting->setAboutText(substr($painting->getAboutText(), 0, 150) . '...');
// This works
}
foreach($auctions as $auction)
{
$auction->setAboutText(substr($auction->getAboutText(), 0, 150) . '...');
// Error : using a member property on a non-object
}
// Rest of function
いくつかのデバッグにより、$paintingsはオブジェクトの配列であり、$auctionsは配列の配列であり、オークションのデータとそれらが関連付けられている絵画が含まれているように見えます。したがって、オークションに関連付けられた絵画のデータに簡単にアクセスできますが、テンプレートに送信する前に直接操作する方法がわかりません。
私の質問 :
- データベースからオークションを配列ではなくオブジェクトとして取得するにはどうすればよいですか?
また - オークションがコントローラー内の絵画のゲッター/セッターにアクセスできるようにするにはどうすればよいですか?
各種情報 :
データベース構成 (Doctrine)
Painting ORM
oneToMany:
painting:
targetEntity: Auction
mappedBy: Painting
Auction ORM
manyToOne:
Painting:
targetEntity: Painting
inversedBy: auction
joinColumn:
name: painting_id
referencedColumnName: id
onDelete: SET NULL
エンティティ (抜粋)
//painting.php
/**
* @var text $about_text
*/
private $about_text;
/**
* Set about_text
*
* @param text $aboutText
*/
public function setAboutText($aboutText)
{
$this->about_text = $aboutText;
}
/**
* Get about_text
*
* @return text
*/
public function getAboutText()
{
return $this->about_text;
}
//auction.php
/**
* @var my\bundle\Entity\Painting
*/
private $Painting;
/**
* Set Painting
*
* @param my\bundle\Entity\Painting $painting
*/
public function setPainting(\my\bundle\Entity\Painting $painting)
{
$this->Painting = $painting;
}
/**
* Get Painting
*
* @return my\bundle\Entity\Painting
*/
public function getPainting()
{
return $this->Painting;
}
クエリ (どちらも PaintingRepository.php にあります)
public function findPaintingsForHomepage()
{
$queryBuilder = $this->getEntityManager()->createQueryBuilder('m');
return $queryBuilder->select('m')
->from('MyBundle:Painting', 'm INDEX BY m.id')
->orderBy('m.updated_at', 'DESC')
->getQuery()
->execute()
;
}
public function findAuctionsForHomepage()
{
$sql =
<<<EOF
SELECT p.*,
(a.amount) as auction_amount,
FROM painting p
LEFT JOIN auction a
ON p.id = a.painting_id
WHERE a.state IS NOT NULL
EOF
;
$stmt = $this->getEntityManager()->getConnection()->prepare($sql);
$stmt->execute();
$result = $stmt->fetchAll();
return $result;
}