Magento2:別のフィールドによるモデルデータの読み込み


8

「メッセージ」という名前のテーブルを以下に示します。

id | posts_id  | message_description | created_at
-----------------------------------------------------------------------------
1      1           test1             2016-09-06 10:00:00
2      1           test2             2016-09-06 11:00:00
3      2           test1             2016-09-06 10:00:00
4      2           test2             2016-09-06 11:00:00

app \ code \ Custom \ Module \ Block \ Edit.php

$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$messages = $objectManager->create('Custom\Module\Model\Messages')->loadByPostsId($this->getRequest()->getParam('id'));
return $messages;

posts_idでメッセージを取得したいと思います。どうすれば入手できますか?

回答:


18

そのためにコレクション使用する必要があります

$messages = $objectManager->create('Custom\Module\Model\ResourceModel\Messages\Collection')->addFieldToFilter('posts_id', $this->getRequest()->getParam('id'));

これはエンティティのコレクションリソースモデルを作成済みであることを前提していますMessages

注意:Object Managerを直接使用しないようにしてください

代わりに、コンストラクターにコレクションクラスを挿入できます

protected $_messagesCollection;

public function __construct(
    ...
    \Custom\Module\Model\ResourceModel\Messages\Collection $messagesCollection,
    ...)
{
    ...
    $this->_messagesCollection = $messagesCollection;
}

そして、コード内で変数を直接使用できます。

$messages = $this->_messagesCollection->addFieldToFilter('posts_id', $this->getRequest()->getParam('id'));

12

そのためにコレクションを使用する必要はありません。

load2番目のパラメーターであるフィールドで関数を呼び出すだけです。

モデルを取得する必要がある構成にファクトリを注入する

protected $messagesFactory;

public function __construct(\Custom\Module\Model\MessagesFactory $messagesFactory){
    $this->_messagesFactory = $messagesFactory;
}

そして、あなたがそれを望む場所:

$messages_model = $this->_messagesFactory->create();
$messages_model->load($the_id,'posts_id');
if(!$messages_model->getId()){
    echo "not found";
}

5
モデルロードメソッドは非推奨としてマークされています。リポジトリの使用に固執する必要があります
Sergey Korzhov

1
はい、非推奨ですが、すべてのモデルに相対リポジトリがあるわけではありません。非推奨のメソッドを回避するには、そのresourceModelを使用する必要があります->getResource()$messages_model->getResource()->load($messages_model, $the_id, 'posts_id')
。ResourceModelに

@LucScuただし、getResource()メソッドも非推奨になりました。ResourceModelを使用してロードするアイデアはありますか?
Siranjeevi KS

0

モデルとリソースファイルに関数を作成します。

public function loadByPostsId($field,$value)
{
    $id = $this->getResource()->loadByPostsId($field,$value);
    return $this->load($id);
}

リソースモデル

public function loadByPostsId($field,$value)
{
    $table = $this->getMainTable();
    $connection = $this->getConnection();
    $where = $connection->quoteInto("$field = ?", $value);
    $select = $connection->select()->from($table,array('posts_id'))->where($where);
    $id = $connection->fetchOne($select);
    return $id;
}

2
このソリューションにはいくつかの欠点もあります。主な理由は、モデルのロードメソッドに、イベントの前後のモデルのロードを開始する重要なコードが含まれていることです。nwdthemes.com/2017/06/10/magento-2-load-model-data-custom-field
Sergey Korzhov

モデルクラスでのload()メソッドの使用は廃止されました。
Abhimanyu Singh
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.