Magento2: Modelldaten durch ein anderes Feld laden


8

Ich habe unten Tabelle mit dem Namen "Nachrichten".

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;

Ich möchte Nachrichten von posts_id abrufen. Wie kann ich das bekommen?

Antworten:


18

Sie müssen dafür Sammlungen verwenden :

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

Dies setzt voraus, dass Sie ein Sammlungsressourcenmodell für Ihre MessagesEntität erstellt haben.

NB: Bitte vermeiden Sie die direkte Verwendung des Objektmanagers

Stattdessen können Sie die Auflistungsklasse in Ihren Konstruktor einfügen :

protected $_messagesCollection;

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

Und dann können Sie Ihre Variable direkt in Ihrem Code verwenden:

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

12

Sie müssen dafür keine Sammlung verwenden.

Rufen Sie einfach die loadFunktion mit einem zweiten Parameter, dem Feld, auf.

Fügen Sie die Factory in das Konstrukt ein, in dem Sie Ihr Modell abrufen müssen

protected $messagesFactory;

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

Und dann, wo Sie es wollen:

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

5
Die Modelllademethode wird als veraltet markiert. Sie sollten bei der Verwendung von Repository bleiben
Sergey Korzhov

1
Ja, es ist veraltet, aber nicht alle Modelle haben das relative Repo. Um eine veraltete Methode zu vermeiden, sollten Sie das resourceModel verwenden. Sie können auf ResourceModel zugreifen ->getResource(). Der richtige Code lautet$messages_model->getResource()->load($messages_model, $the_id, 'posts_id')
LucScu

@LucScu Aber jetzt wird auch die Methode getResource () veraltet. Gibt es eine Idee, mit ResourceModel zu laden?
Siranjeevi KS

0

Erstellen Sie Ihre Funktion in Modell- und Ressourcendateien.

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

In Ihrem Ressourcenmodell

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
Diese Lösung hat auch einige Nachteile. Der Hauptgrund dafür ist, dass die Modelllademethode wichtigen Code enthält, der das Laden des Modells vor / nach Ereignissen initiiert. nwdthemes.com/2017/06/10/magento-2-load-model-data-custom-field
Sergey Korzhov

Die Verwendung der load () -Methode in der Modellklasse wird abgeschrieben.
Abhimanyu Singh
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.