Magento2中的CRUD模型

MUDENTo 2中的CRUD模型可以轻松管理数据库中的数据,您无需编写多行代码来创建CRUD。CRUD代表创建,读取,更新和删除。我们将学习一些主要内容:如何设置数据库,模型,资源模型和资源Magento 2获取集合并执行与数据库相关的操作。在上一篇文章中,我们讨论了在Magento 2中创建控制器

在学习这篇文章之前,让我们来决定我们使用的表格的外观。我将创建一个表mageplaza_helloworld_post并采用以下列:

  • post_id - 帖子唯一标识符
  • name - 帖子的名称
  • url_key - 帖子的网址
  • post_content - 帖子的内容
  • tags - 帖子的标签
  • status - 帖子的状态
  • featured_image - 帖子的形象
  • created_at - 帖子的创建日期
  • updated_at - 帖子的更新日期

在Magento 2中创建Model

  • 第1步:安装脚本
  • 第2步:创建模型
  • 第3步:创建资源模型
  • 第4步:创建资源模型集合
  • 第5步:工厂对象

第1步:安装脚本

首先,我们将为CRUD模型创建数据库表。为此,我们需要插入安装文件:

app/code/Mageplaza/HelloWorld/Setup/InstallSchema.php

安装模块时,此文件只执行一次。让我们为此文件添加此内容以创建上表:

<?php
namespace Mageplaza\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('mageplaza_helloworld_post')) {
			$table = $installer->getConnection()->newTable(
				$installer->getTable('mageplaza_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('mageplaza_helloworld_post'),
				$setup->getIdxName(
					$installer->getTable('mageplaza_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.xmlapp/code/Mageplaza/HelloWorld/etc/module.xml

内容如下:

文件: app/code/Mageplaza/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="Mageplaza_HelloWorld" setup_version="1.1.0">
    </module>
</config>

module.xml文件中,我们改变了属性1.1.0大于setup_version如何创建模块在Magento 2

文件: app/code/Mageplaza/HelloWorld/Setup/UpgradeSchema.php

<?php
namespace Mageplaza\HelloWorld\Setup;

use Magento\Framework\Setup\UpgradeSchemaInterface;
use Magento\Framework\Setup\SchemaSetupInterface;
use Magento\Framework\Setup\ModuleContextInterface;

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('mageplaza_helloworld_post')) {
				$table = $installer->getConnection()->newTable(
					$installer->getTable('mageplaza_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('mageplaza_helloworld_post'),
					$setup->getIdxName(
						$installer->getTable('mageplaza_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

现在检查数据库,您将看到一个包含名称mageplaza_helloworld_post和上面列的表。如果未创建此表,可能是因为您在添加内容之前运行了上述命令行InstallSchema.php。要解决此问题,您需要删除让Magento知道您的模块已安装在系统中的信息。请打开表'setup_module',找到并删除一行等于的模块mageplaza_helloworld_post。在此之后,再次运行该命令以安装该表。

InstallSchema.php用于创建数据库结构。如果要将数据安装到创建的表中,则需要使用InstallData.phpfile:

app/code/Mageplaza/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.phpUpgradeData.php

第2步:创建模型

Model是MVC架构的一条巨大道路。在Magento 2 CRUD中,模型具有许多不同的功能,例如管理数据,安装或升级模块。在本教程中,我只讨论数据管理CRUD。我们必须创建Model,Resource Model,Resource Model Conllection来管理表中的数据:mageplaza_helloworld_post如上所述。

现在我们将创建模型文件:

app/code/Mageplaza/HelloWorld/Model/Post.php

这是该文件的内容:

<?php
namespace Mageplaza\HelloWorld\Model;
class Post extends \Magento\Framework\Model\AbstractModel implements \Magento\Framework\DataObject\IdentityInterface
{
	const CACHE_TAG = 'mageplaza_helloworld_post';

	protected $_cacheTag = 'mageplaza_helloworld_post';

	protected $_eventPrefix = 'mageplaza_helloworld_post';

	protected function _construct()
	{
		$this->_init('Mageplaza\HelloWorld\Model\ResourceModel\Post');
	}

	public function getIdentities()
	{
		return [self::CACHE_TAG . '_' . $this->getId()];
	}

	public function getDefaultValues()
	{
		$values = [];

		return $values;
	}
}

该模型类将扩展AbstractModelMagento\Framework\Model\AbstractModel和实现\Magento\Framework\DataObject\IdentityInterface。IdentityInterface将强制Model类定义getIdentities()将返回模型的唯一ID 的方法。如果模型在数据库操作后需要缓存清除并将信息呈现到前端页面,则必须仅使用此接口。

_construct()只要模型被实例化,就会调用该方法。每个CRUD模型都必须使用_construct()方法来调用_init()方法。这个_init()方法将定义实际从数据库中获取信息的资源模型。如上所述,我们定义资源模型Mageplaza\Post\Model\ResourceModel\Post 关于模型的最后一件事是你应该在模型中使用的一些变量:

  • $_eventPrefix - 要触发的事件的前缀
  • $_eventObject - 事件访问时的对象名称
  • $_cacheTag - 在缓存中使用的唯一标识符

第3步:创建资源模型

如您所知,模型文件包含整体数据库逻辑,它不执行sql查询。资源模型将这样做。现在我们将为此表创建资源模型:app/code/Mageplaza/HelloWorld/Model/ResourceModel/Post.php

此文件的内容:

<?php
namespace Mageplaza\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('mageplaza_helloworld_post', 'post_id');
	}
	
}

Magento中的每个CRUD资源模型都必须扩展抽象类\Magento\Framework\Model\ResourceModel\Db\AbstractDb,其中包含从数据库中获取信息的函数。

与模型类一样,此资源模型类将具有必需的方法_construct()。此方法将调用_init()函数来定义该表的表名和主键。在这个例子中,我们有表mageplaza_helloworld_post和主键post_id

第4步:创建资源模型集合 - 获取模型集合

集合模型被认为是一个资源模型使我们能够筛选和获取集合表中的数据。收集模型将放在:

app/code/Mageplaza/HelloWorld/Model/ResourceModel/Post/Collection.php

此文件的内容:

<?php
namespace Mageplaza\HelloWorld\Model\ResourceModel\Post;

class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection
{
	protected $_idFieldName = 'post_id';
	protected $_eventPrefix = 'mageplaza_helloworld_post_collection';
	protected $_eventObject = 'post_collection';

	/**
	 * Define resource model
	 *
	 * @return void
	 */
	protected function _construct()
	{
		$this->_init('Mageplaza\HelloWorld\Model\Post', 'Mageplaza\HelloWorld\Model\ResourceModel\Post');
	}

}

CRUD集合类必须从函数中扩展\Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection并调用_init()方法来初始化模型,资源模型_construct()

第5步:工厂对象

我们完成了创建数据库表,CRUD模型,资源模型和集合。那么如何使用它们呢?

在这一部分中,我们将讨论模型的工厂对象。如您所知,在OOP中,将使用工厂方法来实例化对象。在Magento中,Factory Object也做同样的事情。

Factory类名称是Model类的名称,并附加“Factory”字样。所以对于我们的例子,我们将有PostFactory类。您不能创建此类。Magento将为您创造它。每当Magento的对象管理器遇到以“Factory”结尾的类名时,var/generation如果该类尚不存在,它将自动在该文件夹中生成Factory类。你会看到工厂类

var/generation/<vendor_name>/<module_name>/Model/ClassFactory.php

在这种情况下,它将是:

var/generation/Mageplaza/HelloWorld/Model/PostFactory.php

要实例化模型对象,我们将使用自动构造函数依赖项注入来注入工厂对象,然后使用工厂对象来实例化模型对象。

例如,我们将调用模型来获取控制器中的数据。

app/code/Mageplaza/HelloWorld/Controller/Index/Index.php

此文件的内容:

<?php
namespace Mageplaza\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并打开mageplaza_helloworld_post表格来添加一些记录来测试帖子模型的工作。

完成后,让我们打开浏览器并导航到

http://<yourhost.com>/helloworld/index/index

并看到结果。

相关文章

0 0 投票数
文章评分
订阅评论
提醒
0 评论
内联反馈
查看所有评论