magento 2でカスタムモジュールのコレクションを取得する方法


9

M 2 0.74.0-beta16でカスタムモジュールを作成しようとしています。カスタムテーブルのコレクションを取得するにはどうすればよいですか。試しました $this->_mymodulemodelFactory->create()->getCollection();。私のモジュール用にファクトリーファイルが生成されますが、getCollection()が指摘します。


回答:


24

モデルコレクションファクトリをコンストラクターに注入する必要があります

protected $mymodulemodelFactory;
public function __construct(
    ....
    \[Namespace]\[Module]\Model\ResourceModel\[Entity]\CollectionFactory $mymodulemodelFactory, 
    ...
)
{
    ...
    $this->mymodulemodelFactory = $mymodulemodelFactory;
    ...
}

そして、あなたはクラスメソッドのどれでも使うことができます:

$collection = $this->mymodulemodelFactory->create();

製品コレクションを取得するためにカスタムインポートでも同じことを試しましたが、csvをインポートすると、ajaxロードシンボルが無期限にロードされます@Marius
Sushivam

エンティティIDに基づいて製品コレクションを取得し、それらのエンティティIDをカスタムテーブルに保存したい
Sushivam

18

カスタムモジュールからコレクションを取得するには、3つのファイルを作成する必要があります

1)モデル、2)ResourceModel、3)コレクション

名前空間:プリンス

モジュール:こんにちは

テーブル:こんにちは

1)Hello.phpモデルファイルを

app / code / Prince / Helloworld / Model / Hello.php

<?php

namespace Prince\Helloworld\Model;

use Magento\Framework\Model\AbstractModel;

class Hello extends AbstractModel
{
    /**
     * Define resource model
     */
    protected function _construct()
    {
        $this->_init('Prince\Helloworld\Model\ResourceModel\Hello');
    }
}

2)Hello.php ResourceModelを作成します

app / code / Prince / Helloworld / Model / ResourceModel / Hello.php

<?php

namespace Prince\Helloworld\Model\ResourceModel;

use Magento\Framework\Model\ResourceModel\Db\AbstractDb;

class Hello extends AbstractDb
{
    /**
     * Define main table
     */
    protected function _construct()
    {
        $this->_init('hello', 'id'); //hello is table of module
    }
}

3)Collection.phpコレクションファイルを作成します

app / code / Prince / Helloworld / Model / ResourceModel / Hello / Collection.php

<?php

namespace Prince\Helloworld\Model\ResourceModel\Hello;

use Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection;

class Collection extends AbstractCollection
{
    /**
     * Define model & resource model
     */
    protected function _construct()
    {
        $this->_init(
            'Prince\Helloworld\Model\Hello',
            'Prince\Helloworld\Model\ResourceModel\Hello'
        );
    }
}

これで、Index.phpコントローラーでコレクションをテストできますapp/code/Prince/Helloworld/Controller/Index/Index.php

<?php

namespace Prince\Helloworld\Controller\Index;

use Magento\Framework\App\Action\Action;
use Magento\Framework\App\Action\Context;
use Prince\Helloworld\Model\HelloFactory;

class Index extends Action
{
    protected $_modelHelloFactory;

    public function __construct(
        Context $context, 
        HelloFactory $modelHelloFactory
    ) {
        parent::__construct($context);
        $this->_modelHelloFactory = $modelHelloFactory;
    }

    public function execute()
    {

        $resultPage = $this->_modelHelloFactory->create();
        $collection = $resultPage->getCollection(); //Get Collection of module data
        var_dump($collection->getData());
        exit;

    }
}

ブロックファイルを使用してテンプレートでコレクションを取得したい場合

nad createを追加する必要がある別の4つのファイル

1.ブロックファイル

2.レイアウトファイル

3.コントローラファイル

4. Templarteファイル

Hello.phpブロックファイルを作成します

namespace vendorName\ModuleName\Block\Index;

use Magento\Framework\App\RequestInterface;
use vendorName\ModuleName\Model\Hello;

class Hello extends \Magento\Framework\View\Element\Template 
{
    protected $helloModelFactory;
    protected $request;

    public function __construct(
        \Magento\Catalog\Block\Product\Context $context,
        Hello $helloModelFactory,
        RequestInterface $request,
        array $data = []
    ) {
        parent::__construct($context, $data);
        $this->_helloModelFactory = $helloModelFactory;
        $this->_request = $request;
    }

    /**
     * Preparing global layout
     *
     * @return $this
     */
    protected function _prepareLayout() {
        parent::_prepareLayout();
        $this->pageConfig->getTitle()->set(__('Display Collection'));
        return $this;
    }

    public function getHello()
    {
        $collection = $this->_helloModelFactory->getCollection();
        return $collection;
    }
}

またはレイアウトファイルroutName_controllername_index.xmlを作成します

<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <body>
        <referenceContainer name="content">
             <block class="vendorName\ModuleName\Block\Event\Index" name="newevent" template="vendorName_ModuleName::Index.phtml" />
        </referenceContainer>
    </body>
</page>

コントローラファイルIndex.phpを作成する

<?php
namespace vendorName\ModuleName\Controller\Index;

use Magento\Framework\App\Action;
use Magento\Framework\View\Result\PageFactory;

class Index extends \Magento\Framework\App\Action\Action 
{
    /**
     * @param Action\Context $context
     */

    protected $resultPageFactory;

    public function __construct(
        Action\Context $context,
        PageFactory $resultPageFactory
    ) {
        parent::__construct($context);
        $this->resultPageFactory = $resultPageFactory;
    }

    public function execute() {

        $this->_view->loadLayout();
        $this->_view->renderLayout();
    }
}

テンプレートファイルIndex.phtmlを作成する

<?php

var_dump($block->getgetHello()->getData());

私はそれが永遠にうまくいくことを願っています


Prince \ Helloworld \ Model \ HelloFactoryを使用します。これはどこ?
ジビンジョージ

申し訳ありません
ジビンジョージ

完全なデータを配列に入れるにはどうすればよいですか?あなたはデータをvar_dumpしていますが、とにかく私は完全なデータを配列に入れることができますか?
jibin george


1

私はそれが少し古いスレッドであることを知っていますが、単純な注入でモデルコレクションを取得するための最良の解決策:

  • モデルがModelInterfaceを実装していることを確認し、di.xmlでModelInterfaceのプリファレンスを設定します。

<preference for="Your\Module\Api\Data\ModelInterface" type="Your\Module\Model\Model"/>

  • コンストラクターにModelInterfaceFactoryを注入する

  protected $_modelFactory;   public function __construct( .... \Your\Module\Api\Data\ModelInterfaceFactory $modelFactory, ... ) { ... $this->_modelFactory = $modelFactory; ... }

  • クラスのどこでも使用できます

    コレクション:

    $collection = $this->_modelFactory->create()->getCollection();

    モデル:

    $model = $this->_modelFactory->create();

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.