5

私はSymfony2を学ぼうとしていますが、現在は「TheBook」の「8:実体関連/関連(関連レコードへの参加)」にいます。例と一緒にコーディングしただけですが(コードをトリプルチェックしました)、次のエラーが発生しました:

注意:未定義のインデックス:C:\ My \ Path \ vendor \ doctrine \ lib \ Doctrine \ ORM \ Internal \ Hydration\ObjectHydrator.php行95の製品

これは私のコードです:

//src\Acme\StoreBundle\Repository\ProductRepository.php
public function findOneByIdJoinedToCategory($id)
{
    $query = $this->getEntityManager()
        ->createQuery('SELECT p, c 
            FROM AcmeStoreBundle:Product p 
            JOIN p.category c 
            WHERE p.id = :id')
        ->setParameter('id', $id);

    try {
        return $query->getSingleResult();
    } catch (\Doctrine\ORM\NoResultException $e) {
        return null;
    }
}

//src\Acme\StoreBundle\Controller\DefaultController.php
public function showAction($id)
{
    $product = $this->getDoctrine()
        ->getRepository('AcmeStoreBundle:Product')
        ->findOneByIdJoinedToCategory($id);

    if (!$product) {
        throw $this->createNotFoundException('No product found for id: '.$id);
    }

    $category = $product->getCategory();

    return $this->render('AcmeStoreBundle:Default:product.html.twig', array(
        'product' => $product,
        'category' => $category)
    );
}

このコードを使用すると、すべてが正常に機能します。

//src\Acme\StoreBundle\Controller\DefaultController.php
public function showAction($id)
{
    $product = $this->getDoctrine()
        ->getRepository('AcmeStoreBundle:Product')
        ->find($id);

    if (!$product) {
        throw $this->createNotFoundException('No product found for id: '.$id);
    }

    $category = $product->getCategory();

    return $this->render('AcmeStoreBundle:Default:product.html.twig', array(
        'product' => $product,
        'category' => $category)
    );
}

何か案は?

編集:製品エンティティ:

<?php
namespace Acme\StoreBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

class Product
{
/**
 * @ORM\Id
 * @ORM\Column(type="integer")
 * @ORM\GeneratedValue(strategy="AUTO")
 */
protected $id;

/**
 * @ORM\Column(type="string", length=100)
 */
protected $name;

/**
 * @ORM\Column(type="decimal", scale=2)
 */
protected $price;

/**
 * @ORM\Column(type="text")
 */
protected $description;

/**
 * @ORM\Column(type="text", nullable="true")
 */
protected $extras;

/**
 * @ORM\ManyToOne(targetEntity="Category", inversedBy="product")
 * @ORM\JoinColumn(name="category_id", referencedColumnName="id")
 */
protected $category;

/**
 * Get id
 *
 * @return integer 
 */
public function getId()
{
    return $this->id;
}

/**
 * Set name
 *
 * @param string $name
 */
public function setName($name)
{
    $this->name = $name;
}

/**
 * Get name
 *
 * @return string 
 */
public function getName()
{
    return $this->name;
}

/**
 * Set price
 *
 * @param decimal $price
 */
public function setPrice($price)
{
    $this->price = $price;
}

/**
 * Get price
 *
 * @return decimal 
 */
public function getPrice()
{
    return $this->price;
}

/**
 * Set description
 *
 * @param text $description
 */
public function setDescription($description)
{
    $this->description = $description;
}

/**
 * Get description
 *
 * @return text 
 */
public function getDescription()
{
    return $this->description;
}

/**
 * Set extras
 *
 * @param text $extras
 */
public function setExtras($extras)
{
    $this->extras = $extras;
}

/**
 * Get extras
 *
 * @return text 
 */
public function getExtras()
{
    return $this->extras;
}

/**
 * Set category
 *
 * @param Acme\StoreBundle\Entity\Category $category
 */
public function setCategory(\Acme\StoreBundle\Entity\Category $category)
{
    $this->category = $category;
}

/**
 * Get category
 *
 * @return Acme\StoreBundle\Entity\Category 
 */
public function getCategory()
{
    return $this->category;
}
}

カテゴリエンティティ:

<?php

namespace Acme\StoreBundle\Entity;

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

/**
 * Acme\StoreBundle\Entity\Category
 *
 * @ORM\Table()
 * @ORM\Entity
 */
class Category
{
/**
 * @var integer $id
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @var string $name
 *
 * @ORM\Column(name="name", type="string", length=255)
 */
private $name;

/**
 * @ORM\OneToMany(targetEntity="Product", mappedBy="category")
 */
protected $products;

public function __construct()
{
    $this->products = new ArrayCollection();
}

/**
 * Get id
 *
 * @return integer 
 */
public function getId()
{
    return $this->id;
}

/**
 * Set name
 *
 * @param string $name
 */
public function setName($name)
{
    $this->name = $name;
}

/**
 * Get name
 *
 * @return string 
 */
public function getName()
{
    return $this->name;
}

/**
 * Add products
 *
 * @param Acme\StoreBundle\Entity\Product $products
 */
public function addProduct(\Acme\StoreBundle\Entity\Product $products)
{
    $this->products[] = $products;
}

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

1 に答える 1

19

わかった。問題は、Productエンティティで、カテゴリの関係が「product」によって逆になり、「products」である必要があると言っていることです。に変更するだけです

/**
 * @ORM\ManyToOne(targetEntity="Category", inversedBy="products")
 * @ORM\JoinColumn(name="category_id", referencedColumnName="id")
 */
protected $category;

そしてそれはうまくいくはずです

于 2012-08-08T13:54:16.810 に答える