簡體   English   中英

symfony 3原則不接受主鍵

[英]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僅適用於ManyToOneOneToOne字段。 這是因為在一對多關系中,表中將沒有包含該關系擁有(“一個”)一方數據的聯接列。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM