2016-04-19 3 views
0

Я изучаю symfony 2. В документации я видел примеры многих отношений. Я попытался сделать это в своем коде. У меня есть два объекта: продукты и категории.Symfony 2 много к одному

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

В объекте Продукт У меня такой код. Я выполнил app\console doctrine:generate:entities AppBundle и app\console doctrine:schema:update --force. Категория таблицы появилась, но в табличных продуктах у меня нет поля category_id. Я очистил кеш, но он не работает. Что не так?

Продукт

<?php 

namespace AppBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use AppBundle\Entity\Category; 

/** 
* Product 
* @ORM\Entity 
* @ORM\Table(name="product") 
*/ 
class Product 
{ 
    /** 
    * @ORM\Column(type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

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

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


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

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


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

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

     return $this; 
    } 

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

    /** 
    * Set price 
    * 
    * @param integer $price 
    * @return Product 
    */ 
    public function setPrice($price) 
    { 
     $this->price = $price; 

     return $this; 
    } 

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

    /** 
    * Set description 
    * 
    * @param string $description 
    * @return Product 
    */ 
    public function setDescription($description) 
    { 
     $this->description = $description; 

     return $this; 
    } 

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

Категория

<?php 

namespace AppBundle\Entity; 

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

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

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

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

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


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

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

     return $this; 
    } 

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

UPD2 после PHP приложения \ консоли доктрины: схемы: обновление --dump-SQL

c:\xampp1\htdocs\first_project 
# php app\console doctrine:schema:update --dump-sql 
CREATE TABLE category (id INT AUTO_INCREMENT NOT NULL, name VARCHAR(255) NOT NUL 
L, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = 
InnoDB; 
CREATE TABLE product (id INT AUTO_INCREMENT NOT NULL, name VARCHAR(128) NOT NULL 
, price INT NOT NULL, description LONGTEXT NOT NULL, PRIMARY KEY(id)) DEFAULT CH 
ARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB; 

COMP323 c:\xampp1\htdocs\first_project 
# 
+0

Попробуйте вручную удалить кеш/dev и кеш/prod? –

+0

Не работает. – Dev

+0

Что возвращает команда? Вы действительно обновите свою базу данных? –

ответ

0

Пожалуйста, попробуйте это в аннотации с полной ссылкой пространства имен к объекту Category.

/** 
    *@ORM\ManyToOne(targetEntity="AppBundle\Entity\Category",inversedBy="products") 
    *@ORM\JoinColumn(name="category_id", referencedColumnName="id") 
*/ 
+0

нет, это не помогло – Dev

0

Эти два работали для меня в symfony 2.8 (lts).

Обновите DB с php app/console doctrine:schema:update --force --dump-sql

Я извлекал методы получения и установки, которые вы можете создать с:

  • php app/console doctrine:generate:entities AppBundle:Product
  • php app/console doctrine:generate:entities AppBundle:Category

product.php

<?php 

namespace AppBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use AppBundle\Entity\Category; 

/** 
* Product 
* @ORM\Entity 
* @ORM\Table(name="product") 
*/ 
class Product 
{ 
    /** 
    * @ORM\Column(type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

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

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

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

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

category.php

<?php 

namespace AppBundle\Entity; 

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

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

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

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

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

Приведенный выше код будет генерировать следующий SQL:

CREATE TABLE category (id INT AUTO_INCREMENT NOT NULL, name VARCHAR(64) NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB; 
CREATE TABLE product (id INT AUTO_INCREMENT NOT NULL, category_id INT DEFAULT NULL, name VARCHAR(100) NOT NULL, price NUMERIC(10, 2) NOT NULL, description LONGTEXT NOT NULL, INDEX IDX_D34A04AD12469DE2 (category_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB; 
ALTER TABLE product ADD CONSTRAINT FK_D34A04AD12469DE2 FOREIGN KEY (category_id) REFERENCES category (id); 
+0

Я использую версию 2.7.11. Я удалил все таблицы и пропустил ваш код, но после выполнения команд ничего не изменилось. – Dev

0

В вашем продукте сущности оных следующий код, а затем запустить эти команды для БД и кэша, то вы увидите этот столбец в своей таблице. (Вы не можете создавать сопоставление при создании сущности через команду, чтобы вручную создавать переменные для этих столбцов.)

/** 
* @var categoryId 
* 
* @ORM\Column(name="category_id", type="integer" , nullable = false) 
*/ 
private $categoryId; 
+0

thx. Я знаю этот метод, но это нехорошее решение. Думаю, – Dev

+0

это не то, как вы создаете объединения в symfony, 'category_id' создается по умолчанию, когда вы используете' JoinColumn', как он использует '@ORM \ JoinColumn (name =" category_id ", referedColumnName =" id ")' –

+0

Как вы думаете, это решение моей проблемы? – Dev

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