[Doctrine \ DBAL \ Exception \ DriverException] ...使用Doctrine

时间:2016-11-04 12:37:54

标签: mysql symfony pdo doctrine-orm

我刚刚使用Doctrine在Symfony3中创建了我的实体。现在,我想生成表来管理它。 出于这个原因,我首先运行此命令行来创建我的数据库:

 php bin/console doctrine:database:create

它工作得很好!现在我想生成表,我只是运行了这个命令行:

 php bin/console doctrine:schema:update --force

我收到了这个错误:

[Doctrine\DBAL\Exception\DriverException]                                                                                                                              
An exception occurred while executing 'CREATE TABLE contribution (id INT 
AUTO_INCREMENT NOT NULL, question_id INT DEFAULT NULL, libelle TEXT NOT  NULL, 
type VARCHAR(2  
55) NOT NULL, nombre_like INT NOT NULL, date_publication DATETIME NOT NULL,   report TINYINT(1) NOT NULL, UNIQUE INDEX UNIQ_EA351E15A4D60759 (libelle), INDEX IDX_EA351  
E151E27F6BF (question_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB':                                                       
SQLSTATE[42000]: Syntax error or access violation: 1170 BLOB/TEXT column 'libelle' used in key specification without a key length



[Doctrine\DBAL\Driver\PDOException]                                                                                                
SQLSTATE[42000]: Syntax error or access violation: 1170 BLOB/TEXT column  'libelle' used in key specification without a key length

[PDOException]                                                                                                                     
SQLSTATE[42000]: Syntax error or access violation: 1170 BLOB/TEXT column 'libelle' used in key specification without a key length

这是我的评论表实体:

  class Commentaire
{
/**
 * @var int
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
protected $id;
/**
 * @var string
 * @ORM\Column(name="libelle", type="text", nullable=true)
 */
private $libelle;

/**
 * @var int
 *
 * @ORM\Column(name="depth", type="integer")
 */
protected $depth;

/**
 * @var int
 *
 * @ORM\Column(name="parent_id", type="integer")
 */
protected $parent_id;

/**
 * @var int
 *
 * @ORM\Column(name="nombre_like", type="integer")
 */
protected $nombreLike;

/**
 * @var \DateTime
 *
 * @ORM\Column(name="date_publication", type="datetimetz", nullable=false)
 */
protected $datePublication;

/**
 * @var bool
 *
 * @ORM\Column(name="report", type="boolean")
 */
protected $report;

/**
 * @ORM\ManyToOne(targetEntity="Contribution", inversedBy="commentaires")
 * @var Contribution
 */
protected $contribution;

/**
 * @ManyToMany(targetEntity="Enseignant", mappedBy="commentaires")
 */
protected $enseignants;

/**
 * @ManyToMany(targetEntity="Etudiant", mappedBy="commentaires")
 */
protected $etudiants;


/**
 * Get id
 *
 * @return int
 */
public function getId()
{
    return $this->id;
}

/**
 * Set libelle
 *
 * @param string $libelle
 *
 * @return Commentaire
 */
public function setLibelle($libelle)
{
    $this->libelle = $libelle;

    return $this;
}

/**
 * Get libelle
 *
 * @return string
 */
public function getLibelle()
{
    return $this->libelle;
}

/**
 * Set depth
 *
 * @param integer $depth
 *
 * @return Commentaire
 */
public function setDepth($depth)
{
    $this->depth = $depth;

    return $this;
}

/**
 * Get depth
 *
 * @return int
 */
public function getDepth()
{
    return $this->depth;
}

/**
 * Set parentId
 *
 * @param integer $parentId
 *
 * @return Commentaire
 */
public function setParentId($parentId)
{
    $this->parent_id = $parentId;

    return $this;
}

/**
 * Get parentId
 *
 * @return int
 */
public function getParentId()
{
    return $this->parent_id;
}

/**
 * Set nombreLike
 *
 * @param integer $nombreLike
 *
 * @return Commentaire
 */
public function setNombreLike($nombreLike)
{
    $this->nombreLike = $nombreLike;

    return $this;
}

/**
 * Get nombreLike
 *
 * @return int
 */
public function getNombreLike()
{
    return $this->nombreLike;
}

/**
 * Set datePublication
 *
 * @param \DateTime $datePublication
 *
 * @return Commentaire
 */
public function setDatePublication($datePublication)
{
    $this->datePublication = $datePublication;

    return $this;
}

/**
 * Get datePublication
 *
 * @return \DateTime
 */
public function getDatePublication()
{
    return $this->datePublication;
}

/**
 * Set report
 *
 * @param boolean $report
 *
 * @return Commentaire
 */
public function setReport($report)
{
    $this->report = $report;

    return $this;
}

/**
 * Get report
 *
 * @return bool
 */
public function getReport()
{
    return $this->report;
}
/**
 * Constructor
 */
public function __construct()
{
    $this->enseignants = new \Doctrine\Common\Collections\ArrayCollection();
    $this->etudiants = new \Doctrine\Common\Collections\ArrayCollection();
}

/**
 * Set contribution
 *
 * @param \AppBundle\Entity\Contribution $contribution
 *
 * @return Commentaire
 */
public function setContribution(\AppBundle\Entity\Contribution $contribution = null)
{
    $this->contribution = $contribution;

    return $this;
}

/**
 * Get contribution
 *
 * @return \AppBundle\Entity\Contribution
 */
public function getContribution()
{
    return $this->contribution;
}

/**
 * Add enseignant
 *
 * @param \AppBundle\Entity\Enseignant $enseignant
 *
 * @return Commentaire
 */
public function addEnseignant(\AppBundle\Entity\Enseignant $enseignant)
{
    $this->enseignants[] = $enseignant;

    return $this;
}

/**
 * Remove enseignant
 *
 * @param \AppBundle\Entity\Enseignant $enseignant
 */
public function removeEnseignant(\AppBundle\Entity\Enseignant $enseignant)
{
    $this->enseignants->removeElement($enseignant);
}

/**
 * Get enseignants
 *
 * @return \Doctrine\Common\Collections\Collection
 */
public function getEnseignants()
{
    return $this->enseignants;
}

/**
 * Add etudiant
 *
 * @param \AppBundle\Entity\Etudiant $etudiant
 *
 * @return Commentaire
 */
public function addEtudiant(\AppBundle\Entity\Etudiant $etudiant)
{
    $this->etudiants[] = $etudiant;

    return $this;
}

/**
 * Remove etudiant
 *
 * @param \AppBundle\Entity\Etudiant $etudiant
 */
public function removeEtudiant(\AppBundle\Entity\Etudiant $etudiant)
{
    $this->etudiants->removeElement($etudiant);
}

/**
 * Get etudiants
 *
 * @return \Doctrine\Common\Collections\Collection
 */
public function getEtudiants()
{
    return $this->etudiants;
}}

libelle似乎是正确的,但我不知道为什么会出现这个错误。我甚至将libelle的类型更改为字符串,但错误仍然存​​在。我认为是因为doctrine在libelle列上添加了索引(请参阅查询),因为类型是TEXT,所以这是禁止的。知道怎么删除吗?请帮忙!

1 个答案:

答案 0 :(得分:0)

错误消息说明了一切:

  

BLOB / TEXT专栏' libelle'在没有密钥长度的密钥规范中使用

关于create index声明的MySQL文档说(突出显示是我的):

  

对于字符串列,可以创建仅使用前导的索引   列值的一部分,使用col_name(length)语法指定   索引前缀长度:

     

•可以为CHAR,VARCHAR,BINARY和VARBINARY指定前缀   列索引。

     

必须为BLOB和TEXT列索引指定前缀。

     

•前缀限制以字节为单位,而前缀长度为   解释CREATE TABLE,ALTER TABLE和CREATE INDEX语句   作为非二进制字符串类型的字符数(CHAR,VARCHAR,   TEXT)和二进制字符串类型的字节数(BINARY,VARBINARY,   BLOB)。在为a指定前缀长度时请考虑到这一点   非二进制字符串列,它使用多字节字符集。

     

•对于空间列,无法给出前缀值,如上所述   在本节后面。

     

此处显示的语句使用前10个创建索引   name列的字符(假设该名称具有非二进制名称   字符串类型):

CREATE INDEX part_of_name ON customer (name(10));

这意味着您必须在为libelle字段创建的索引上使用前缀。 Doctrine在libelle字段中添加了一个唯一限制。如果不需要,则删除此限制,然后无论如何都不需要创建索引。

替代方法是将数据库中的数据类型更改为varchar。