[英]symfony 3 doctrine does not accept primary key
我是Symfony的新手,正在嘗試建立實體和關系。 即使我似乎已經正確注釋了主鍵。
跑步時
PHP的bin /控制台學說:模式:驗證
我收到如下錯誤:
引用的列名稱“ brandId”必須是目標實體類“ AppBundle \\ Entity \\ Brands”上的主鍵列。
實體看起來像(僅相關部分):
謝謝
品牌
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
/**
* @ORM\Entity
* @ORM\Table(name="brands")
*/
class Brands
{
/**
* @ORM\Id
* @ORM\Column(type="smallint",length=3,unique=true,options={"unsigned":true})
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $brandId;
/**
* one brands has many models
* @ORM\OneToMany(targetEntity="Models", mappedBy="brandId")
* @ORM\JoinColumn(name="brandId", referencedColumnName="brandId")
*/
private $models;
public function __construct()
{
$this->models = new ArrayCollection();
}
楷模:
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass="AppBundle\Repository\ModelsRepository")
* @ORM\Table(name="models")
*/
class Models
{
/**
* @ORM\Column(type="smallint",length=4,unique=true,options={"unsigned":true})
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $modelId;
/**
* @ORM\Column(type="string", length=25)
*/
private $model;
/**
* Many models for one brand
* @ORM\ManyToOne(targetEntity="Brands",inversedBy="models")
* @ORM\JoinColumn(name="brandId", referencedColumnName="brandId")
*/
private $brandId;
在您的Brands
模型中,不應存在此注釋。
* @ORM\JoinColumn(name="brandId", referencedColumnName="brandId")
JoinColumn
僅適用於ManyToOne
和OneToOne
字段。 這是因為在一對多關系中,表中將沒有包含該關系擁有(“一個”)一方數據的聯接列。
JoinColumn
用於在“許多”側定義一列,該列標識“一個”側的哪個記錄擁有它,因此可以將其包含在“ Models
模型中。
有效且干凈的實體映射應類似於:
Brand.php
/**
* @ORM\Entity
* @ORM\Table(name="brands")
*/
class Brand
{
/**
* @var integer
*
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
protected $id;
/**
* one brands has many models
*
* @ORM\OneToMany(targetEntity="AppBundle\Entity\Model", mappedBy="brand")
*/
private $models;
public function __construct()
{
$this->models = new ArrayCollection();
}
}
Model.php
class Model
{
/**
* @var integer
*
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
protected $id;
/**
* @ORM\Column(type="string", length=25)
*/
private $name;
/**
* Many models for one brand
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Brand",inversedBy="models")
*/
private $brand;
}
易於清潔使用:
$brand->getId(); //get id of brand
$brand->getModels(); //get array of Model object, ArrayCollection
$model->getBrand()->getId(); // Get id of related brand of some model
$model->getBrand()->getName(); //get the name of other propery of related brand
錯誤答案已刪除...
溫馨提示:實體類或更佳的實例應表示表的單個數據集。 因此,它們的名稱應為單數;)通過為主鍵列選擇沒有前綴的名稱,您可以節省一些代碼,因為Doctrine可以發揮其魔力。 另外,如果不對所有列都加前綴,則不應在表名稱的前加前綴。
所有這些最終成為了Doctrine命名策略的一個問題,我不知道。 詳情請參閱本文
在我嘗試使mysql的下划線命名策略適應PHP的駝峰命名策略時,該策略被設置為默認策略。 這導致Symfony無法找到主要數據庫,因此也找不到錯誤。
一旦了解了這一點,並獲得了我從這篇文章中獲得的寶貴意見,我就將實體重構如下:
謝謝你們。
品牌
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
/**
* @ORM\Entity
* @ORM\Table(name="brands")
*/
class Brands
{
/**
* @var integer
*
* @ORM\Id
* @ORM\Column(type="smallint",length=3,unique=true,options={"unsigned":true})
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* one brands has many models
*
* @ORM\OneToMany(targetEntity="Models", mappedBy="brandId")
*/
private $models;
public function __construct()
{
$this->models = new ArrayCollection();
}
/**
* @ORM\Column(type="string", length=25)
*/
private $brand;
.......
}
楷模
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass="AppBundle\Repository\ModelsRepository")
* @ORM\Table(name="models")
*/
class Models
{
/**
* @var integer
*
* @ORM\Id
* @ORM\Column(type="smallint",length=4,unique=true,options={"unsigned":true})
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\Column(type="string", length=25)
*/
private $model;
/**
* Many models for one brand
* @ORM\ManyToOne(targetEntity="Brands",inversedBy="models")
* @ORM\JoinColumn(name="brand_id", referencedColumnName="id")
*/
private $brandId;
/**
* Many models for one segment
* @ORM\ManyToOne(targetEntity="Segments", inversedBy="models")
* @ORM\JoinColumn(name="segment_id", referencedColumnName="id")
*/
private $segmentId;
.....
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.