0

絵画を参照して販売する 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;
}
4

1 に答える 1

0

プレーンなクエリ結果をドクトリン エンティティ オブジェクトにマップする必要があります。ネイティブ クエリについてお読みください。

    $em = $this->getEntityManager();
    $rsm = new \Doctrine\ORM\Query\ResultSetMappingBuilder($em);
    $rsm->addRootEntityFromClassMetadata('my\bundle\Entity\Painting', 'p');
于 2013-07-04T13:45:20.767 に答える