我目前正在phpmyadmin上使用xampp/apache和mariadb。我正在尝试基于我的代码创建一个表,使用条令和注解来验证表单。我只想将表单中输入的值存储在数据库中。在另一个例子中,这种方法非常有效。
但是现在我有一个“checkbox字段”,我猜它在创建数据库时会引起一些麻烦。
我在控制台中使用这些命令:
php bin/console make:migration
之后:
php bin/console doctrine:migrations:migrate
调用第二个=在数据库中创建表时,出现以下错误:
Migration 20181121103017 failed during Execution.
Error An exception occurred while executing 'CREATE TABLE pizza (id INT
AUTO_INCREMENT NOT NULL, name VARCHAR(255) NOT NULL, address VARCHAR(255) NOT NULL
phone VARCHAR(255) NOT NULL, email VARCHAR(255) NOT NULL,
size INT NOT NULL, ingredient JSON NOT NULL COMMENT '(DC2Type:json_array)', delivery INT NOT NULL,
PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB':
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in
your SQL syntax; check the manual that
corresponds to your MariaDB server version for the right syntax to use near
'JSON NOT NULL COMMENT '(DC2Type:json_
array)', delivery INT NOT NULL, PRIMARY KEY' at line 1
我真的不知道在这一点上我做错了什么。
这些是我在“pizza.php”文件中的注解。
// ------------------
/**
* @Assert\NotBlank(
* message = "E-Mail Address required"
* )
* @Assert\Email(
* message = "The email '{{ value }}' is not a valid email."
* )
* @Assert\Length(min="2", max="255")
* @ORM\Column(type="string", length=255)
*/
protected $email;
// ------------------
/**
* @Assert\Range(min=0, max=3)
* @ORM\Column(type="integer")
*/
protected $size;
// ------------------
/**
*@Assert\NotBlank(
* message = "Choose at least 1 ingredient!"
* )
* @ORM\Column(type="array")
*/
protected $ingredient;
// ------------------
/**
* @Assert\NotBlank(
* message = "Choose a delivery option!"
* )
* @Assert\Range(min=0, max=1)
* @ORM\Column(type="integer")
*/
protected $delivery;
表单本身运行得非常好,验证确实按照我的预期工作。
我到底做错了什么?
如果你还需要我的“pizza.php”(实体类)或我的控制器文件中的代码,请告诉我。
我很感激你的帮助!
3条答案
按热度按时间wn9m85ua1#
根据您的评论,似乎条令认为它可以使用在您的mariadb版本中不可用的功能。
如果您告诉Doritory您使用的是哪个版本,它将为该列选择正确的数据类型,在本例中可能是这样
LONGTEXT
或者类似的东西。根据您使用的是什么,它看起来像(例如使用symfony中的yaml文件):
请注意,您需要重新生成迁移。
正如我在评论中提到的,我个人会规范化数据库,并使用不同的表格将比萨饼与配料联系起来,以便于搜索和过滤。
mmvthczy2#
有同样的问题,我找到了解决方法:
在
Doctrine.yaml
发现服务器的\u版本比我的mariadb版本高,所以我在这行中更正了这一点:在手动删除已完成的迁移之前,我没有工作。你可以在里面找到它们
src/Migrations
.然后再次运行:
这就成功了,希望能有所帮助。
d4so4syb3#
首先检查你的版本。版本10.1不支持json数据类型,对版本10.2的支持不完整。
一个解决方法是将document.yaml文件中的版本
server_version: '5.6'
然后用php bin/console make:entity --regenerate
然后使用php bin/console make:migration
这将生成一个数据类型设置为longtext的迁移文件。然后,在src/migrations中打开其中的每个文件,检查是否有任何以json作为数据类型的迁移文件,并删除所有具有此类数据类型的迁移。请记住,如果不删除这些文件,则下一个命令将对每个文件进行迭代,从旧文件开始逐个将它们持久化到数据库。如果存在这样的文件,它将再次触发错误。
最后,快跑
php bin/console doctrine:migrations:migrate
它将相应地保留所有到数据库的迁移。