我刚刚使用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,所以这是禁止的。知道怎么删除吗?请帮忙!
答案 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。