Magento2 怎么创建模型 资源模型和集合

现在,我们已经创建了表。 我们需要某种方式来操纵(即执行CRUD操作)表数据。 要执行CRUD(创建,读取,更新,删除)操作,我们必须为每个表创建这三个类(即模型,资源模型和集合)。 Model的名称来自MVC(模型-视图-控制器)体系结构。

Model

模型代表一个单一的实体。我指的是表中的一行。该模型在资源模型上提供了一个抽象层。

让我们为“ blogmanager_blog”表创建一个模型。 为此,在我们的模块文件夹中创建一个名为Model的文件夹。 在该文件夹中创建Blog.php文件,

<?php
namespace Yshuq\BlogManager\Model;

class Blog extends \Magento\Framework\Model\AbstractModel implements \Magento\Framework\DataObject\IdentityInterface
{

    const NOROUTE_ENTITY_ID = 'no-route';
    const ENTITY_ID = 'entity_id';
    const CACHE_TAG = 'yshuq_blogmanager_blog';
    protected $_cacheTag = 'yshuq_blogmanager_blog';
    protected $_eventPrefix = 'yshuq_blogmanager_blog';

    public function _construct()
    {
        $this->_init(\Webkul\BlogManager\Model\ResourceModel\Blog::class);
    }

    public function load($id, $field = null)
    {
        if ($id === null) {
            return $this->noRoute();
        }
        return parent::load($id, $field);
    }

    public function noRoute()
    {
        return $this->load(self::NOROUTE_ENTITY_ID, $this->getIdFieldName());
    }

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

    public function getId()
    {
        return parent::getData(self::ENTITY_ID);
    }

    public function setId($id)
    {
        return $this->setData(self::ENTITY_ID, $id);
    }

}

模型类将扩展\ Magento \ Framework \ Model \ AbstractModel并实现\ Magento \ Framework \ DataObject \ IdentityInterface。IdentityInterface将强制Model类定义getIdentities()方法,该方法将为每个模型返回唯一的ID。

之前我说过“该模型在资源模型上提供了一层抽象。” 我的意思是,我们在代码中使用模型类来操作表,但是实际查询由资源模型类执行。 因此,每个模型都将需要一个资源模型,该资源模型将执行实际的sql查询。当我们创建一个新对象时,将执行_construct方法,该方法将调用init方法,在该方法中我们必须将资源模型作为参数进行传递。

同样,我们需要为“ blogmanager_comment”表创建模型,作为Model / Comment.php

<?php

namespace Yshuq\BlogManager\Model;

class Comment extends \Magento\Framework\Model\AbstractModel implements \Magento\Framework\DataObject\IdentityInterface
{

    const NOROUTE_ENTITY_ID = 'no-route';
    const ENTITY_ID = 'entity_id';
    const CACHE_TAG = 'yshuq_blogmanager_comment';
    protected $_cacheTag = 'yshuq_blogmanager_comment';
    protected $_eventPrefix = 'yshuq_blogmanager_comment';

    public function _construct()
    {
        $this->_init(\Webkul\BlogManager\Model\ResourceModel\Comment::class);
    }

    public function load($id, $field = null)
    {
        if ($id === null) {
            return $this->noRoute();
        }
        return parent::load($id, $field);
    }

    public function noRoute()
    {
        return $this->load(self::NOROUTE_ENTITY_ID, $this->getIdFieldName());
    }

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

    public function getId()
    {
        return parent::getData(self::ENTITY_ID);
    }

    public function setId($id)
    {
        return $this->setData(self::ENTITY_ID, $id);
    }

}

Resource Model

我们已经讨论了资源模型的重要性。 因此,让我们深入研究代码。

首先,我们将为“ blogmanager_blog”表创建资源模型。 为此,我们必须在Model文件夹下创建一个ResourceModel文件夹,然后在该ResourceModel文件夹内创建Blog.php文件。

<?php


namespace Yshuq\BlogManager\Model\ResourceModel;


class Blog extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb
{

    public function _construct()
    {
        $this->_init("blogmanager_blog", "entity_id");
    }
}

在这里,我们不得不提及表名和表的主键。 所有资源模型类都将扩展\ Magento \ Framework \ Model \ ResourceModel \ Db \ AbstractDb类,这些类具有用于实际数据库操作的通用功能。

同样,我们需要为“ blogmanager_comment”表创建资源模型,如Model / ResourceModel / Comment.php。

<?php


namespace Yshuq\BlogManager\Model\ResourceModel;


class Comment extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb
{
    public function _construct()
    {
        $this->_init("blogmanager_comment", "entity_id");
    }
}

Collection

我们知道模型代表表的一行,而集合代表表的所有行。 我们可以将集合视为模型的集合或“ Select * From Table table_name”。

因此,如果我们必须访问表的所有/多个行,或者使用where / like执行某些过滤器,或者使用order进行一些排序,那么我们应该使用collection

而如果我们必须插入一行或获取一行或更新一行中的某一列或删除一行,则必须使用模型。

现在,我们为“ blogmanager_blog”表创建集合类。 为此,我们必须在ResourceModel文件夹下创建一个名称与资源模型类名称相同的文件夹。 因此,这里我们将在Model / ResourceModel /文件夹下创建一个名为Blog的文件夹。 在该文件夹下,我们将创建Collection.php类。

<?php
namespace Yshuq\BlogManager\Model\ResourceModel\Blog;
class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection
{
    protected $_idFieldName = 'entity_id';

    public function _construct()
    {
        $this->_init(
            \Yshuq\BlogManager\Model\Blog::class,
            \Yshuq\BlogManager\Model\ResourceModel\Blog::class
        );
        $this->_map['fields']['entity_id'] = 'main_table.entity_id';
    }
}

在这里,当我们在构造函数中调用init方法时,我们必须同时提供模型和资源模型。

同样,我们可以为“ blogmanager_comment”表创建集合,作为Model / ResourceModel / Comment / Collection.php

<?php
namespace Yshuq\BlogManager\Model\ResourceModel\Blog;
class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection
{
    protected $_idFieldName = 'entity_id';

    public function _construct()
    {
        $this->_init(
            \Yshuq\BlogManager\Model\Blog::class,
            \Yshuq\BlogManager\Model\ResourceModel\Blog::class
        );
        $this->_map['fields']['entity_id'] = 'main_table.entity_id';
    }
}

创建所有类之后,我们需要运行di compile命令。 如果您还记得哪一个,则是php bin / magento setup:di:compile

di compile会自动生成一些代码,您可以在magento根目录下的generate / code文件夹中找到这些代码。 我们将在本系列博客的后面部分中详细了解代码生成。

注意:如果您对文件夹结构感到困惑,请检查类的名称空间。

在这里,我们了解了为什么以及如何创建这些类。 在接下来的博客中,我们将介绍如何使用它们。

到现在为止的文件夹结构应该像

代码目录结构