如何将数据库记录与对象关联

时间:2013-08-21 12:10:30

标签: symfony doctrine-orm doctrine

我按照此处的文档http://symfony.com/doc/current/book/doctrine.html 我有一个问题。

我在类别和产品模型之间创建了一个关系。数据库已正确更新,模型类有正确的getter和setter,但如果我尝试运行以下代码:

$product = $this->getDoctrine()->getRepository('AcmeStoreBundle:Product')
            ->findById(1);

$categoryName = $product->getCategory()->getName();

我收到错误:

  

FatalErrorException:错误:在a上调用成员函数getName()   非对象   d:\ WWW \的Symfony的\ src \ Acme的\ StoreBundle \控制器\ DefaultController.php   第28行

我检查了它,类别模型类有getName()方法,它是一个公共方法。

我的 Product.orm.yml 看起来像

Acme\StoreBundle\Entity\Product:
    type: entity
    manyToOne:
        category:
            targetEntity: Category
            inversedBy: products
            joinColumn:
                name: category_id
                referencedColumnName: id
    table: null
    fields:
        id:
            type: integer
            id: true
            generator:
                strategy: AUTO
        name:
            type: string
            length: 255
        price:
            type: decimal
    lifecycleCallbacks: {  }

Category.orm.yml

Acme\StoreBundle\Entity\Category:
    type: entity
    oneToMany:
        products:
            targetEntity: Product
            mappedBy: category
    table: null
    fields:
        id:
            type: integer
            id: true
            generator:
                strategy: AUTO
        name:
            type: string
            length: '255'
    lifecycleCallbacks: {  }

Product.php

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

Category.php

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

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

有什么问题?

1 个答案:

答案 0 :(得分:1)

您正在示例代码中检索$category而不是$product

$product = $this->getDoctrine()->getManager()->getRepository('AcmeStoreBundle:Product')->findOneById(1);

$categoryName = $product->getCategory()->getName();

请注意,您忘记了getManager()

修改:您需要使用findOneById()代替findById。第一种方法只返回一个结果(您的对象),findBy*将返回一个结果数组,您无法在循环内遍历它而无法调用getCategory()