Symfony 2 多对一
Posted
技术标签:
【中文标题】Symfony 2 多对一【英文标题】:Symfony 2 many to one 【发布时间】:2016-04-19 09:07:56 【问题描述】:我正在学习 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 app\console 学说之后:schema:update --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
#
【问题讨论】:
你不需要 JoinColumn 这些值将默认设置Category
至少缺少@ORM\Entity
和@ORM\Id
。
请删除数据库中的两个表并将php app/console doctrine:schema:update --dump-sql
的输出添加到您的问题中。还要检查你使用的是什么版本的 symfony。使用 sf3 控制台命令更改为 bin/console
。
@Vadim.K 您应该更新问题中的实体,以便我们知道您修复了这里每个人的建议,尤其是 Yoshi,也为未来的读者提供了建议。
检查here。
【参考方案1】:
请在注释中尝试使用对 Category 实体的完整命名空间引用。
/**
*@ORM\ManyToOne(targetEntity="AppBundle\Entity\Category",inversedBy="products")
*@ORM\JoinColumn(name="category_id", referencedColumnName="id")
*/
【讨论】:
【参考方案2】:这两个在 symfony 2.8 (lts) 中为我工作。
使用php app/console doctrine:schema:update --force --dump-sql
更新您的数据库
我已经删除了你可以生成的 getter 和 setter:
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);
【讨论】:
我用的是2.7.11版本。我删除了所有的表,把你的代码过去了,但是执行命令后,什么都没有改变【参考方案3】:在您的产品实体中添加以下代码,然后为数据库和缓存运行这些命令,然后您将在表中看到此列。 (通过命令创建实体时无法创建映射,因此您必须手动为这些列创建变量。)
/**
* @var categoryId
*
* @ORM\Column(name="category_id", type="integer" , nullable = false)
*/
private $categoryId;
【讨论】:
这不是你在 symfony 中创建连接的方式,category_id
是在你使用 JoinColumn
时默认创建的,就像他使用 @ORM\JoinColumn(name="category_id", referencedColumnName="id")
一样
你认为这是我的问题的解决方案吗?
@Vadim.K,很抱歉,我个人认为这不是一个解决方案。
我尝试添加此代码,但在生成实体后,我在表中没有列以及获取和设置函数...
php app/console dictionary:schema:validate (运行看看你的schema有没有错误)以上是关于Symfony 2 多对一的主要内容,如果未能解决你的问题,请参考以下文章