浏览文章

文章信息

Magento2数据库操作-CRUD模型 12848

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.xmlat app/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.phpUpgradeData.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;
   }
}

该模型类将扩展AbstractModelMagento\Framework\Model\AbstractModel并实现\Magento\Framework\DataObject\IdentityInterfaceIdentityInterface将强制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模型已经创建完毕!

原创