我是Symfony的新手并尝试设置实体和关系。即使我似乎正确地注释了主键。
运行时
php bin / console doctrine:schema:validate
我收到如下错误:
引用的列名'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;
答案 0 :(得分:1)
在Brands
模型中,此注释不应出现。
* @ORM\JoinColumn(name="brandId", referencedColumnName="brandId")
JoinColumn
仅适用于ManyToOne
和OneToOne
字段。这是因为在一对多关系中,表中不会有包含关系拥有(“一”)一侧数据的连接列。
JoinColumn
用于定义“多”一侧的列,用于标识“一”侧的哪条记录拥有该列,因此将其包含在Models
模型中是可以的。
答案 1 :(得分:1)
有效且干净的实体映射应该类似于:
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
答案 2 :(得分:0)
错误的答案已删除......
额外提示:实体类或更好的实例应代表表的单个数据集。所以他们的名字应该是单数;) 通过为主键列选择不带前缀的名称,可以省去一些代码,因为Doctrine可以使用它的魔力。 如果你没有为所有列添加前缀,你也不应该在列中加上表名前缀。
答案 3 :(得分:0)
这最终成为了Doctrine的命名策略的一个问题,我不知道。见this article for details
该策略被设置为默认策略,而我正在尝试将mysql的下划线命名策略应用于PHP的驼峰命名策略。这导致Symfony找不到主要错误。
一旦我了解了这一点,并且通过这篇文章收到的宝贵意见,我已经重构了以下实体:
谢谢大家。
品牌
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;
.....
}
模型
d = str(date_range).replace('[','{').replace(']','}').replace('\'',"").replace('\'',"")
print d
output: '{2017/01/01,2017/01/02,2017/01/03,2017/01/04,2017/01/05,2017/01/06,2017/01/07,2017/01/08,2017/01/09,2017/01/10,2017/01/11,2017/01/12,2017/01/13,2017/01/14,2017/01/15,2017/01/16,2017/01/17,2017/01/18,2017/01/19, 2017/01/20,2017/01/21,2017/01/22,2017/01/23,2017/01/24,2017/01/25,2017/01/26, 2017/01/27,2017/01/28,2017/01/29,2017/01/30,2017/01/31}'