symfony 3 doctrine不接受主键

时间:2017-05-15 21:06:58

标签: php entity-framework symfony doctrine-orm orm

我是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;

4 个答案:

答案 0 :(得分:1)

Brands模型中,此注释不应出现。

* @ORM\JoinColumn(name="brandId", referencedColumnName="brandId")

JoinColumn仅适用于ManyToOneOneToOne字段。这是因为在一对多关系中,表中不会有包含关系拥有(“一”)一侧数据的连接列。

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}'