浏览文章
文章信息
CRUD模型在Magento 2
Magento 2 get collection可以轻松管理数据库中的数据,您无需编写任何代码即可创建CRUD
Magento 2中的CRUD模型可以轻松管理数据库中的数据,您无需编写很多代码即可创建CRUD。CRUD代表创建,读取,更新和删除。我们将学习一些主要内容:如何设置数据库,模型,资源模型和资源Magento 2获取集合以及进行数据库相关的操作。在上一篇文章中,我们讨论了在Magento 2中创建控制器
在学习本文之前,让我们决定要使用的表的外观。我将创建一个表,
aiweline_helloworld_post
并包含以下几列:
post_id
-帖子唯一标识符name
-职位名称url_key
-帖子的网址post_content
-帖子内容tags
-帖子的标签status
-职位状态featured_image
-帖子的图片created_at
-帖子的创建日期updated_at
-帖子的更新日期在Magento 2中创建模型
步骤1:安装脚本
首先,我们将为CRUD模型创建数据库表。为此,我们需要插入安装文件:
app/code/Aiweline/HelloWorld/Setup/InstallSchema.php安装模块时,该文件仅执行一次。让此文件的此内容创建上表:
<?php
/**
* Created by PhpStorm.
* User: 秋枫雁飞
* Date: 2019/11/23
* Time: 13:13
* Web:www.aiweline.com
* Copyright © 2016 Aiweline. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Aiweline\HelloWorld\Setup;
class InstallSchema implements \Magento\Framework\Setup\InstallSchemaInterface
{
public function install(\Magento\Framework\Setup\SchemaSetupInterface $setup, \Magento\Framework\Setup\ModuleContextInterface $context)
{
$installer = $setup;
$installer->startSetup();
if (!$installer->tableExists('aiweline_helloworld_post')) {
$table = $installer->getConnection()->newTable(
$installer->getTable('aiweline_helloworld_post')
)
->addColumn(
'post_id',
\Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
null,
[
'identity' => true,
'nullable' => false,
'primary' => true,
'unsigned' => true,
],
'Post ID'
)
->addColumn(
'name',
\Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
255,
['nullable => false'],
'Post Name'
)
->addColumn(
'url_key',
\Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
255,
[],
'Post URL Key'
)
->addColumn(
'post_content',
\Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
'64k',
[],
'Post Post Content'
)
->addColumn(
'tags',
\Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
255,
[],
'Post Tags'
)
->addColumn(
'status',
\Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
1,
[],
'Post Status'
)
->addColumn(
'featured_image',
\Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
255,
[],
'Post Featured Image'
)
->addColumn(
'created_at',
\Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP,
null,
['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT],
'Created At'
)->addColumn(
'updated_at',
\Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP,
null,
['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT_UPDATE],
'Updated At')
->setComment('Post Table');
$installer->getConnection()->createTable($table);
$installer->getConnection()->addIndex(
$installer->getTable('aiweline_helloworld_post'),
$setup->getIdxName(
$installer->getTable('aiweline_helloworld_post'),
['name', 'url_key', 'post_content', 'tags', 'featured_image'],
\Magento\Framework\DB\Adapter\AdapterInterface::INDEX_TYPE_FULLTEXT
),
['name', 'url_key', 'post_content', 'tags', 'featured_image'],
\Magento\Framework\DB\Adapter\AdapterInterface::INDEX_TYPE_FULLTEXT
);
}
$installer->endSetup();
}
}此内容显示了如何创建表,您可以对其进行编辑以创建自己的表。请注意,Magento将在安装模块时首次自动运行此文件。如果您之前安装了模块,则需要升级模块并将表创建代码写入该文件夹中的UpgradeSchema.php,并更改属性
setup_version
大于当前安装版本的module.xml
atapp/code/Aiweline/HelloWorld/etc/module.xml
。内容将是:
文件:
app/code/Aiweline/HelloWorld/etc/module.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
<module name="Aiweline_HelloWorld" setup_version="1.1.0">
</module>
</config>在
module.xml
文件中,我们改变了属性1.1.0
大于setup_version
在如何在Magento 2创建模块文件:
app/code/Aiweline/HelloWorld/Setup/UpgradeSchema.php
<?php
/**
* Created by PhpStorm.
* User: 秋枫雁飞
* Date: 2019/11/23
* Time: 13:16
* Web:www.aiweline.com
* Copyright © 2016 Aiweline. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Aiweline\HelloWorld\Setup;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\SchemaSetupInterface;
use Magento\Framework\Setup\UpgradeSchemaInterface;
class UpgradeSchema implements UpgradeSchemaInterface
{
public function upgrade(SchemaSetupInterface $setup, ModuleContextInterface $context)
{
$installer = $setup;
$installer->startSetup();
if (version_compare($context->getVersion(), '1.1.0', '<')) {
if (!$installer->tableExists('aiweline_helloworld_post')) {
$table = $installer->getConnection()->newTable(
$installer->getTable('aiweline_helloworld_post')
)
->addColumn(
'post_id',
\Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
null,
[
'identity' => true,
'nullable' => false,
'primary' => true,
'unsigned' => true,
],
'Post ID'
)
->addColumn(
'name',
\Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
255,
['nullable => false'],
'Post Name'
)
->addColumn(
'url_key',
\Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
255,
[],
'Post URL Key'
)
->addColumn(
'post_content',
\Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
'64k',
[],
'Post Post Content'
)
->addColumn(
'tags',
\Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
255,
[],
'Post Tags'
)
->addColumn(
'status',
\Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
1,
[],
'Post Status'
)
->addColumn(
'featured_image',
\Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
255,
[],
'Post Featured Image'
)
->addColumn(
'created_at',
\Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP,
null,
['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT],
'Created At'
)->addColumn(
'updated_at',
\Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP,
null,
['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT_UPDATE],
'Updated At')
->setComment('Post Table');
$installer->getConnection()->createTable($table);
$installer->getConnection()->addIndex(
$installer->getTable('aiweline_helloworld_post'),
$setup->getIdxName(
$installer->getTable('aiweline_helloworld_post'),
['name', 'url_key', 'post_content', 'tags', 'featured_image'],
\Magento\Framework\DB\Adapter\AdapterInterface::INDEX_TYPE_FULLTEXT
),
['name', 'url_key', 'post_content', 'tags', 'featured_image'],
\Magento\Framework\DB\Adapter\AdapterInterface::INDEX_TYPE_FULLTEXT
);
}
}
$installer->endSetup();
}
}之后,请运行以下命令行:
php bin/magento setup:upgrade运行升级完成后,请像这样继续运行部署
php bin/magento setup:static-content:deploy现在检查数据库,您将看到一个包含名称
aiweline_helloworld_post
和上方各列的表。如果未创建此表,则可能是因为您在将内容添加到之前运行了上述命令行InstallSchema.php
。要解决此问题,您需要删除使Magento知道模块已安装在系统中的信息。请打开表“ setup_module”,找到并删除模块等于的行aiweline_helloworld_post
。此后,再次运行命令以安装表。这
InstallSchema.php
用于创建数据库结构。如果要将数据安装到创建的表中,则需要使用InstallData.php
文件:app/code/Aiweline/HelloWorld/Setup/InstallData.php请在Magento中查看一些InstallData文件,以了解如何使用它。这是一些文件,您可以看到:
- vendor/magento/module-tax/Setup/InstallData.php - vendor/magento/module-customer/Setup/InstallData.php - vendor/magento/module-catalog/Setup/InstallData.php就像我上面说的,那些安装文件将用于第一次安装模块。如果要在升级模块时更改数据库,请尝试使用
UpgradeSchema.php
和UpgradeData.php
。步骤2:建立模型
模型是MVC架构的重要途径。在Magento 2 CRUD中,模型具有许多不同的功能,例如管理数据,安装或升级模块。在本教程中,我仅讨论数据管理CRUD。我们必须创建模型,资源模型,资源模型集合以管理表中的数据:
aiweline_helloworld_post
如上所述。现在我们将创建模型文件:
app/code/Aiweline/HelloWorld/Model/Post.php这是该文件的内容:
<?php
/**
* Created by PhpStorm.
* User: 秋枫雁飞
* Date: 2019/11/23
* Time: 13:18
* Web:www.aiweline.com
* Copyright © 2016 Aiweline. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Aiweline\HelloWorld\Model;
class Post extends \Magento\Framework\Model\AbstractModel implements \Magento\Framework\DataObject\IdentityInterface
{
const CACHE_TAG = 'aiweline_helloworld_post';
protected $_cacheTag = 'aiweline_helloworld_post';
protected $_eventPrefix = 'aiweline_helloworld_post';
protected function _construct()
{
$this->_init('aiweline\HelloWorld\Model\ResourceModel\Post');
}
public function getIdentities()
{
return [self::CACHE_TAG . '_' . $this->getId()];
}
public function getDefaultValues()
{
$values = [];
return $values;
}
}该模型类将扩展AbstractModel类
Magento\Framework\Model\AbstractModel
并实现\Magento\Framework\DataObject\IdentityInterface
。IdentityInterface将强制Model类定义getIdentities()
方法,该方法将返回模型的唯一ID。只有在数据库操作后需要清除模型的高速缓存并将信息呈现到前端页面后,才必须使用此接口。
_construct()
实例化模型时将调用该方法。每个CRUD模型都必须使用_construct()方法来调用_init()方法。此_init()方法将定义资源模型,该资源模型实际上将从数据库中获取信息。如上所述,我们定义了资源模型Aiweline\Post\Model\ResourceModel\Post
关于模型的最后一件事是您应该在模型中使用的一些变量:
$_eventPrefix
-触发事件的前缀$_eventObject
-事件中访问时的对象名称$_cacheTag
-在缓存中使用的唯一标识符步骤3:创建资源模型
如您所知,模型文件包含整体数据库逻辑,它不执行sql查询。资源模型将做到这一点。现在,我们将为此表创建资源模型:
app/code/Aiweline/HelloWorld/Model/ResourceModel/Post.php
该文件的内容:
<?php
/**
* Created by PhpStorm.
* User: 秋枫雁飞
* Date: 2019/11/23
* Time: 13:19
* Web:www.aiweline.com
* Copyright © 2016 Aiweline. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Aiweline\HelloWorld\Model\ResourceModel;
class Post extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb
{
public function __construct(
\Magento\Framework\Model\ResourceModel\Db\Context $context
)
{
parent::__construct($context);
}
protected function _construct()
{
$this->_init('aiweline_helloworld_post', 'post_id');
}
}Magento中的每个CRUD资源模型都必须扩展抽象类
\Magento\Framework\Model\ResourceModel\Db\AbstractDb
,该抽象类包含用于从数据库中获取信息的功能。像模型类一样,此资源模型类将具有required方法
_construct()
。该方法将调用_init()
函数来定义表名称和该表的主键。在此示例中,我们有table(表)aiweline_helloworld_post
和主键post_id
。步骤4:创建资源模型集合-获取模型集合
该集合模型被认为是一个资源模型使我们能够筛选和获取集合表中的数据。收集模型将放置在:
app/code/Aiweline/HelloWorld/Model/ResourceModel/Post/Collection.php该文件的内容:
<?php
/**
* Created by PhpStorm.
* User: 秋枫雁飞
* Date: 2019/11/23
* Time: 13:21
* Web:www.aiweline.com
* Copyright © 2016 Aiweline. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Aiweline\HelloWorld\Model\ResourceModel\Post;
class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection
{
protected $_idFieldName = 'post_id';
protected $_eventPrefix = 'aiweline_helloworld_post_collection';
protected $_eventObject = 'post_collection';
/**
* Define resource model
*
* @return void
*/
protected function _construct()
{
$this->_init('Aiweline\HelloWorld\Model\Post', 'Aiweline\HelloWorld\Model\ResourceModel\Post');
}
}CRUD集合类必须从方法中扩展
\Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection
并调用该_init()
方法以初始化模型,_construct()
函数中的资源模型。步骤5:工厂对象
我们已经完成了创建数据库表,CRUD模型,资源模型和集合的工作。那么如何使用它们呢?
在这一部分中,我们将讨论模型的工厂对象。如您在OOP中所知,工厂方法将用于实例化对象。在Magento中,工厂对象执行相同的操作。
Factory类名称是Model类的名称,并附加“ Factory”字样。因此,对于我们的示例,我们将拥有PostFactory类。您不能创建此类。Magento将为您创建它。每当Magento的对象管理器遇到以单词“ Factory”结尾的类名称时,
var/generation
如果该类尚不存在,它将自动在文件夹中生成Factory类。您将在var/generation/<vendor_name>/<module_name>/Model/ClassFactory.php在这种情况下,我们生成的文件将是:
var/generation/Aiweline/HelloWorld/Model/PostFactory.php为了实例化模型对象,我们将使用自动构造函数依赖注入来注入工厂对象,然后使用工厂对象来实例化模型对象。
例如,我们将调用模型以在controller中获取数据。
app/code/Aiweline/HelloWorld/Controller/Index/Index.php该文件的内容:
<?php
/**
* Created by PhpStorm.
* User: 秋枫雁飞
* Date: 2019/11/23
* Time: 13:23
* Web:www.aiweline.com
* Copyright © 2016 Aiweline. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Aiweline\HelloWorld\Controller\Index;
class Index extends \Magento\Framework\App\Action\Action
{
protected $_pageFactory;
protected $_postFactory;
public function __construct(
\Magento\Framework\App\Action\Context $context,
\Magento\Framework\View\Result\PageFactory $pageFactory,
\Mageplaza\HelloWorld\Model\PostFactory $postFactory
)
{
$this->_pageFactory = $pageFactory;
$this->_postFactory = $postFactory;
return parent::__construct($context);
}
public function execute()
{
$post = $this->_postFactory->create();
$collection = $post->getCollection();
foreach ($collection as $item) {
echo "<pre>";
print_r($item->getData());
echo "</pre>";
}
exit();
return $this->_pageFactory->create();
}
}如您在该控制器中看到的那样,将在
_construct()
函数中创建PostFactory对象。在execute()
函数中,我们用于$post = $this->_postFactory->create();
创建模型对象。现在,您需要转到phpmyadmin并打开
aiweline_helloworld_post
表以添加一些记录以测试发布模型工作。完成后,我们打开浏览器并导航到
http://<yourhost.com>/helloworld/index/index并查看结果。
至此,基本CRUD模型已经创建完毕!