Получить ассоциацию OneToMany от ManyToOne

Я новичок в фреймворках и Symfony, и я пытаюсь изучить некоторые основы.

У меня есть ассоциация OneToMany от сущности под названием Product. Обратной является ассоциация ManyToOne из объекта под названием Description. Я пытаюсь получить описание, которое будет отображаться в моем файле ветки от моего контроллера продукта.

В объекте продукта у меня есть:

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, я получаю сообщение об ошибке:

Переменная «описания» не существует в src/Pas/ShopTestBundle/Resources/views/Product/show.html.twig в строке 22 (где вы видите первое описание в строке 22...)

В описаниях сущности и ее контроллера все работает. Я могу ввести описание с идентификатором, соответствующим идентификатору из объекта/контроллера продукта. В общем, я хочу, чтобы описание, которое я там ввожу, отображалось в продукте. (Я надеюсь это имеет смысл)

Описание Сущность:

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;

Я уверен, что я близко, но я не могу понять это. Любая помощь приветствуется и заранее спасибо!


person Pal Chet    schedule 11.02.2016    source источник


Ответы (2)


В вашем контроллере вы передаете в представление следующие переменные:

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

Но затем в twig вы ссылаетесь на описание var в этой строке:

{% for description in descriptions %}

Это ошибка. На ваш взгляд, у вас есть только сущность var, и у этой сущности много описаний, поэтому вы пытаетесь сделать следующее:

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

Надеюсь, вы уловили идею.

person abdiel    schedule 11.02.2016

Вы не передаете описания в своем контроллере в представление.

Кроме того, ваша точка зрения неверна. вы перебираете описания, а затем запрашиваете entity.description

либо передайте переменную descriptions в свое представление, либо измените представление на

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

И, возможно, также покажите свой класс Description.

person Niels    schedule 11.02.2016
comment
Теперь я получаю сообщение об ошибке: во время рендеринга шаблона возникло исключение (Catchable Fatal Error: объект класса Pascal\ShopTestBundle\Entity\Description не может быть преобразован в строку) в src/Pascal/ShopTestBundle/Resources/views/Product /show.html.twig в строке 23. У меня есть __toString для описаний... Если только речь не идет о описаниях - person Pal Chet; 11.02.2016
comment
Покажет класс описаний - person Pal Chet; 11.02.2016