2013-08-21 3 views
0

Я следую документам отсюда http://symfony.com/doc/current/book/doctrine.html и у меня есть проблема.Как связать запись базы данных с объектом

Я создал связь между категорией и моделью продукта. База данных была обновлена ​​правильно, классы моделей имеют правильные методы получения и установки, но если я пытаюсь запустить следующий код:

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

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

я получает ошибку:

FatalErrorException: Error: Call to a member function getName() on a non-object in D:\www\Symfony\src\Acme\StoreBundle\Controller\DefaultController.php line 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

Вы извлекаете $category вместо $product в свой пример кода.

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

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

обратите внимание, что вы забыли getManager()

Edit: Вы должны использовать findOneById() вместо findById. Первый метод вернет только один результат (ваш объект), findBy* вернет вам массив результатов, по которым вы не можете позвонить getCategory(), не пройдя его внутри цикла.

+0

Я пробовал разные варианты, но он не работает. 'FatalErrorException: Ошибка: вызов функции-члена getCategory()' – deem

+0

Почему у вас есть эти файлы '* .orm.yml'? И вы уверены, что у продукта 1 есть категория? –

+0

Я использовал консольные команды, и тогда он был сгенерирован. BTW docs ничего не говорит о 'getManager()' (http://symfony.com/doc/current/book/doctrine.html) – deem

Смежные вопросы