本篇我们将介绍通过 setup script 创建数据表,创建 Magento 2 model, resource model, collection ,以及如何通过它们对数据进行增删改查。 Magento 2 中的 CRUD Models 用于操纵数据库中的数据,不需要很多代码就可以创建一个 CRUD 。 CRUD 代表 Create, Read, Update and Delete (增删改查)。 我们将创建一个表 thankit_helloworld_post
Name
Description
post_id
ID 主键
name
post 的名称
url_key
Post URL Key
post_content
post 的内容
tags
post tags
status
post 状态
featured_image
Post Featured Image
sample_country_selection
Post Sample Country Selection
sample_multiselect
Post Sample Multiselect
created_at
创建时间
updated_at
更新时间
第一步:Setup Script
File:app/code/ThankIT/HelloWorld/Setup/InstallSchema.php
1 | <?php |
了解 addColumn() addIndex() addForeignKey 的参数参照 vendor/magento/framework/DB/Ddl/Table
该文件只会在安装模块时执行一次。如果你以前安装过该模块了,这个文件就不会执行了。 执行命令行:
1 | php bin/magento setup:upgrade |
如果你的数据库中没有出现 thankit_helloworld_post
表,那么请在数据库中找到 setup_module
表,找到 ThankIT_HelloWorld
的记录,删掉这行记录。然后再运行上面的命令行。 InstallSchema.php
是用来创建数据库结构的,如果你想插入记录的话,使用 InstallData.php
参考下面的文件,看 InstallData.php
是怎么个用法:
1 | - vendor/magento/module-tax/Setup/InstallData.php |
这些安装文件是在初次安装时执行的,如果你想在升级时做点什么,请使用 UpgradeSchema.php
和 UpgradeData.php
第二步:创建 Model
Magento 2 中模型有很多作用,比如操作数据,安装或升级模块。在本教程中,我们只涉及数据的增删改查操作。我们要操作 thankit_helloworld_post
中的数据,需要创建 Model, Resource Model, Resource Model Conllection File: app/code/ThankIT/HelloWorld/Model/Post.php
1 | <?php |
Model 必须继承 \Magento\Framework\Model\AbstractModel
而该类又继承自 \Magento\Framework\Object
,这样我们的 model 就拥有了额外的方法,比如 load, delete, save, toArray, toJson, toString, toXml
Model 中关键的代码是
1 | /** |
第三步:Resource Model
Model 中包含总体上的数据逻辑,但它不执行 sql 语句,由 Resource model 做。 File: ThankIT\HelloWorld\Model\ResourceModel\Post.php
1 | <?php |
所有 resource model 都必须继承 \Magento\Framework\Model\ResourceModel\Db\AbstractDb
该 class 包含着从数据库中取数据的方法。 和 model 类一样,resource model 也必须有 _construct()
方法,该方法调用 _init()
方法来定义表名和主键。 该例中重要的代码是:
1 | /** |
第四步:Resource Model Collection
collection model 可以看作是一个 resource model,通过它我们可以获取数据的集合,可以对数据集合进行过滤。 File:ThankIT\HelloWorld\Model\ResourceModel\Post\Collection.php
1 | <?php |
collection 类继承自 \Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection
关键代码:
1 | /** |
\Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection
继承自 \Magento\Framework\Data\Collection\AbstractDb
,而 AbstractDb 继承自 \Magento\Framework\Data\Collection
, Collection 最后实现以下接口 \Countable
, Magento\Framework\Option\ArrayInterface
, and Magento\Framework\Data\CollectionDataSourceInterface
这么多层的继承,collection 类就获得了非常多的方法,比如 join, addFieldToFilter, count, getAllIds, getColumnValues, getFirstItem, getLastItem
等。
第五步:Factory Object
OOP 中,工厂方法是用来实例化对象的。在 Magento 2 中,Factory Object 也是一样。 Magento 的 object manager 遇到一个以 Factory
结尾的类时,如果该类不存在,那么就会在 var/generation
目录下自动生成一个。 下面以例子来说明: File: ThankIT\HelloWorld\Block\Index\Index.php
1 | <?php |
每个 case 分别去掉注释进行测试,查看效果。
参考文档
CRUD Models in Magento 2 Magento 2: CRUD Models for Database Access