在开发模块的前端部分之前,让我们创建一些表。 最好先创建表格。 因为它有助于我们可视化模块的工作,从而帮助我们逐步开发模块。
我们将开发一个简单的博客管理器模块,因此我们需要一个表来保存博客数据,并需要另一个表来保存评论。 如果将来需要任何其他表,或者如果我们必须添加/修改任何列,那么我们可以在Magento中轻松地做到这一点。
Declarative Schema
Declarative Schema:申明式架构
Magento 2使用声明式架构创建表。 要了解有关数据库模式或与此主题有关的任何主题的更多信息,请在主题上进行谷歌搜索,您会发现多个博客已对该主题进行了解释。 Magento Developer Documentation是一个需要详细学习的好地方:
对于声明性架构,我们需要在etc文件夹下创建db_schema.xml。
<?xml version="1.0"?>
<schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Setup/Declaration/Schema/etc/schema.xsd">
<table name="blogmanager_blog" resource="default" engine="innodb" comment="Blogs Table">
<column xsi:type="int" name="entity_id" padding="10" unsigned="true" nullable="false" identity="true" comment="Entity Id"/>
<column xsi:type="int" name="user_id" padding="10" unsigned="true" nullable="false" comment="Customer/User Id"/>
<column xsi:type="varchar" name="title" nullable="false" length="255" comment="Blog Title"/>
<column xsi:type="longtext" name="content" nullable="false" comment="Blog Content"/>
<column xsi:type="smallint" name="status" padding="11" unsigned="false" nullable="false" default="0" comment="Blog Status"/>
<column xsi:type="timestamp" name="created_at" on_update="false" nullable="false" default="CURRENT_TIMESTAMP" comment="Creation Time"/>
<column xsi:type="timestamp" name="updated_at" on_update="true" nullable="false" default="CURRENT_TIMESTAMP" comment="Updated At"/>
<constraint xsi:type="primary" referenceId="PRIMARY">
<column name="entity_id"/>
</constraint>
<index referenceId="BLOGMANAGER_BLOG_USER_ID" indexType="btree">
<column name="user_id"/>
</index>
</table>
<table name="blogmanager_comment" resource="default" engine="innodb" comment="Blog Comments Table">
<column xsi:type="int" name="entity_id" padding="10" unsigned="true" nullable="false" identity="true" comment="Entity Id"/>
<column xsi:type="int" name="blog_id" padding="10" unsigned="true" nullable="false" comment="Blog Id"/>
<column xsi:type="int" name="user_id" padding="10" unsigned="true" nullable="false" comment="User Id"/>
<column xsi:type="varchar" name="screen_name" nullable="false" length="255" comment="Screen Name"/>
<column xsi:type="text" name="comment" nullable="false" comment="Comment"/>
<column xsi:type="smallint" name="status" padding="11" unsigned="false" nullable="false" default="0" comment="Status"/>
<column xsi:type="timestamp" name="created_at" on_update="false" nullable="false" default="CURRENT_TIMESTAMP" comment="Creation Time"/>
<constraint xsi:type="primary" referenceId="PRIMARY">
<column name="entity_id"/>
</constraint>
<constraint xsi:type="foreign" referenceId="FK_BLOG_COMMENT" table="blogmanager_comment" column="blog_id" referenceTable="blogmanager_blog" referenceColumn="entity_id" onDelete="CASCADE"/>
<index referenceId="BLOGMANAGER_COMMENT_BLOG_ID" indexType="btree">
<column name="blog_id"/>
</index>
</table>
</schema>
如您所见,这很容易解释,表节点/表标记表示表,表节点内的列节点表示每列。 我们可以使用标签/节点的属性来管理有关列的name,type,length 等信息,要创建像主键,外键这样的约束,我们必须使用constraint标记;我们还可以使用索引标签(index)创建索引。 在这里,我们创建了两个表blogmanager_blog,blogmanager_comment
创建db_schema.xml之后,我们需要生成db_schema_whitelist.json,该数据提供了所有以声明性架构添加的表,列,键的历史记录。 您不必担心此文件,因为它可以使用命令自动生成。 这是为了向后兼容,将来会删除。
php bin/magento setup:db-declaration:generate-whitelist --module-name=Yshuq_BlogManager
它将在etc文件夹中创建db_schema_whitelist.json。
现在要实际处理db_schema.xml并创建表,我们需要运行setup upgrade命令。
php bin/magento setup:upgrade
成功运行此命令后,当您检查数据库时,将找到新表,
现在,假设稍后我们决定更改某些内容,我们只需在db_schema.xml文件中进行更改,重新生成db_schema_whitelist.json并运行setup upgrade命令即可。
Install Schema and Upgrade Schema
声明式架构是对magento的新添加。 在2.3之前的Magento早期版本中,我们必须使用InstallSchema.php文件创建表。 如果以后我们决定对表进行一些更改,则必须使用UpgradeSchema.php。 因此,第一次安装模块时,它将运行InstallSchema.php文件,而对于版本更新,它将运行UpgradeSchema.php。
请查看这些说明如何使用这些文件的博客。 请注意,它在我们的模块中不起作用,因为我们没有在module.xml文件中提到模块版本号.
现在的文件夹结构如下: