从ManyToOne获取OneToMany关联

时间:2016-02-11 14:12:23

标签: php entity-framework symfony orm

我是框架和Symfony的新手,我正在尝试学习一些基础知识。

我有一个名为Product的实体的OneToMany关联。它的逆是来自名为Description的实体的ManyToOne关联。我试图让我的产品控制器在我的twig文件中显示描述。

在产品实体中,我有:

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
/**
 * Product
 *
 * @ORM\Table(name="products")
 * @ORM\Entity(repositoryClass="Pas\ShopTestBundle\Entity\ProductRepository")
 */
class Product
{
    /**
     * @var ArrayCollection
     *
     * @ORM\OneToMany(targetEntity="Description", mappedBy="product")
     */
    private $descriptions;

    // MORE CODE BELOW....

    /**
     * Creates Constructor for ArrayCollection
     */
    public function __construct() 
    {
        $this->descriptions = new ArrayCollection();
    }

    MORE CODE...
    /**
     * Add descriptions
     *
     * @param \Pas\ShopTestBundle\Entity\Description $descriptions
     * @return Product
     */
    public function addDescription(\Pas\ShopTestBundle\Entity\Description $descriptions)
    {
        $this->descriptions[] = $descriptions;

        return $this;
    }

    /**
     * Remove descriptions
     *
     * @param \Pas\ShopTestBundle\Entity\Description $descriptions
     */
    public function removeDescription(\Pas\ShopTestBundle\Entity\Description $descriptions)
    {
        $this->descriptions->removeElement($descriptions);
    }

    /**
     * Get descriptions
     *
     * @return \Doctrine\Common\Collections\Collection 
     */
    public function getDescriptions()
    {
        return $this->descriptions;
    }

    /**
     * Converts Product Name to a Viewable String
     * @return String
     */
    public function __toString() 
    {
        return $this->getName();

        return $this->getDescriptions();
    }
}

我试图让我的' showAction'中的说明出现在show.html.twig上。在那个函数中我有:

 /**
 * Finds and displays a Product entity.
 *
 * @Route("/{id}", name="product_show")
 * @Method("GET")
 * @Template()
 */
public function showAction($id)
{
    $em = $this->getDoctrine()->getManager();

    $entity = $em->getRepository('PasShopTestBundle:Product')->find($id);

    // $descriptionInfo = $em->getRepository('PasShopTestBundle:Description')
    //     ->find($id)
    //     ->getProductDesciption();

    //get description to appear on show page

    if (!$entity) {
        throw $this->createNotFoundException('Unable to find Product entity.');
    } else {
        $productInfo = $entity->getDescriptions();
    }

    $deleteForm = $this->createDeleteForm($id);

    return array(
        'entity'      => $entity,
        'delete_form' => $deleteForm->createView(),
    );
}

正如您所看到的,我尝试了一些事情,但是,我不确定它是否正确。

在show.html.twig中我有:

<tr>
    <th>Description</th>
    {% for description in descriptions %}
        <td>{{ entity.description }}</td>
    {% endfor %}
{# --------- Need Description Show.html.twig to go to above ------------------ #}
</tr>

现在,如果我去看我的showAction&#39;路线我收到错误:

  

变量&#34;描述&#34;在第22行的src / Pas / ShopTestBundle / Resources / views / Product / show.html.twig中不存在   (你看到第一个描述是第22行......)

在描述实体及其控制器中,一切正常。我可以输入具有与产品实体/控制器中的ID相对应的ID的描述。总而言之,我希望我在那里输入的描述出现在产品中。 (我希望这是有道理的)

描述实体:

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collection\ArrayCollection;

/**
 * Description
 *
 * @ORM\Table(name="descriptions")
 * @ORM\Entity(repositoryClass="Pas\ShopTestBundle\Entity\DescriptionRepository")
 */
class Description
{

    /**
     * @var Product
     *
     * @ORM\ManyToOne(targetEntity="Product", inversedBy="descriptions")
     * @ORM\JoinColumn(name="product_id", referencedColumnName="id")
     */
    private $product;

我确定我已经关闭,但我无法弄明白。感谢任何帮助,并感谢先进!

2 个答案:

答案 0 :(得分:0)

您没有将控制器中的描述传递给视图。

此外,您的观点是错误的。 你循环描述,然后要求entity.description

将描述变量传递给您的视图或将视图更改为

<tr>
    <th>Description</th>
    {% for description in entity.descriptions %}
        <td>{{ description }}</td>
    {% endfor %}
</tr>

也许可以显示你的描述类。

答案 1 :(得分:0)

在控制器中,您将以下变量传递给视图:

return array(
    'entity'      => $entity,
    'delete_form' => $deleteForm->createView(),
);

但是在树枝上你引用了这行中的描述var:

{% for description in descriptions %}

那是错误。在您的视图中,您只有实体var,并且该实体有许多描述,因此您尝试执行的操作是:

{% for description in entity.descriptions %}
    <td>{{ description.text }}</td>
{% endfor %}

希望你明白这一点。