Symfony2以一对多关系获取序列化对象

时间:2015-07-27 07:57:22

标签: symfony doctrine-orm

如何在jsonSerialize方法中获取序列化的cardPrices? id与CardPrice有OneToMany的关系,但如何获得此价格? 'price' => $this->getId()->getPriceNet()不起作用。

CustomerCardSubtype.php

class CustomerCardSubtype implements \JsonSerializable
{
    /**
     * Primary key.
     *
     * @var int
     *
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     * @ORM\OneToMany(targetEntity="CardPrice", mappedBy="customerCardSubtype")
     */
    private $id;

/**
 * @return array
 */
public function jsonSerialize()
{
    return [
        'id' => $this->getId(),
        'description' => $this->getDescription(),
        'name' => $this->getName()
    ];
}

CardPrice.php

class CardPrice implements \JsonSerializable
{

    /**
     * CustomerCardSubtype.
     *
     * @var CustomerCardSubtype
     *
     * @ORM\ManyToOne(targetEntity="CustomerCardSubtype")
     * @ORM\JoinColumn(name="customer_card_subtype_id", referencedColumnName="id", nullable=false, onDelete="RESTRICT")
     */
    private $customerCardSubtype;

/**
 * Get priceNet.
 *
 * @return float
 */
public function getPriceNet()
{
    return $this->priceNet;
}

1 个答案:

答案 0 :(得分:1)

您误解了Doctrine Association Mapping的用法; id应该是(并且是)一个整数,因此您无法在其上调用方法。这不起作用:

'price' => $this->getId()->getPriceNet()

相反,为关联本身创建一个属性(以及可选的get / set方法)。

您的CustomerCardSubtype应该是这样的:

<?php

class CustomerCardSubtype implements \JsonSerializable
{
    /**
     * Primary key.
     *
     * @var int
     *
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * Association.
     *
     * @ORM\OneToMany(targetEntity="CardPrice", mappedBy="customerCardSubtype")
     */
    private $cardPrice;

    /**
     * @param CardPrice $cardPrice
     */
    public function setCardPrice($cardPrice)
    {
        $this->cardPrice = $cardPrice;
    }

    /**
     * @return CardPrice
     */
    public function getCardPrice()
    {
        return $this->cardPrice;
    }

    /**
     * @return array
     */
    public function jsonSerialize()
    {
        return [
            'id' => $this->getId(),
            'description' => $this->getDescription(),
            'name' => $this->getName(),
            'price' => $this->cardPrice->getPriceNet()
        ];
    }
}

您现在应该能够在关联对象上调用getPriceNet方法。如果您希望json_encode整个CardPrice对象作为嵌套元素,您也可以在其上实现JsonSerializable。希望这可以帮助。