从 ManyToOne 获取 OneToMany 关联

Posted

技术标签:

【中文标题】从 ManyToOne 获取 OneToMany 关联【英文标题】:Get OneToMany association from ManyToOne 【发布时间】:2016-02-11 14:12:22 【问题描述】:

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

我有一个来自名为 Product 的实体的 OneToMany 关联。它的反面是来自名为 Description 的实体的 ManyToOne 关联。我正在尝试从我的产品控制器获取描述以显示在我的树枝文件中。

在产品实体中我有:

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”路线,我会得到错误:

第 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;

我确定我很接近,但我无法完全弄清楚。任何帮助表示赞赏,并提前感谢!

【问题讨论】:

【参考方案1】:

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

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

但是在 twig 中,您在这一行中引用了 descriptions var:

% for description in descriptions %

这就是错误。在您看来,您只有实体 var 并且该实体有很多描述,所以您尝试做的是:

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

希望你能明白。

【讨论】:

【参考方案2】:

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

另外,你的观点是错误的。 你循环描述,然后询问 entity.description

要么将 descriptions 变量传递给您的视图,要么将视图更改为

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

也许还会显示你的描述类。

【讨论】:

我现在收到错误:在 src 中渲染模板期间引发了异常(“可捕获的致命错误:类 Pascal\ShopTestBundle\Entity\Description 的对象无法转换为字符串”) /Pascal/ShopTestBundle/Resources/views/Product/show.html.twig 在第 23 行。不过,我确实有一个 __toString 用于描述......除非它不是在谈论 decriptions 将显示描述类

以上是关于从 ManyToOne 获取 OneToMany 关联的主要内容,如果未能解决你的问题,请参考以下文章

在 Hibernate 双向 ManytoOne、OnetoMany 的映射列中获取 null

java - 如何在Java Spring中从Hibernate双向OneToMany ManyToOne中检索数据

JPA、OneToMany 和 ManyToOne

JPA 的 n+1 问题是不是与 @OneToMany 或 @ManyToOne 或两者有关?

onetomany / manytoone 的无限循环?春天/休息api

如何正确映射@OneToMany 和@ManyToOne 关系,以便我可以保存和更新@OneToMany 端(有或没有@ManyToOne 端)