我按照此处的文档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();
}
...
有什么问题?
答案 0 :(得分:1)
您正在示例代码中检索$category
而不是$product
。
$product = $this->getDoctrine()->getManager()->getRepository('AcmeStoreBundle:Product')->findOneById(1);
$categoryName = $product->getCategory()->getName();
请注意,您忘记了getManager()
修改:您需要使用findOneById()
代替findById
。第一种方法只返回一个结果(您的对象),findBy*
将返回一个结果数组,您无法在循环内遍历它而无法调用getCategory()
。