Magento2: Carregar dados do modelo por outro campo

8

Eu tenho a tabela abaixo chamada "mensagens".

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;

Gostaria de recuperar mensagens por posts_id. Como posso conseguir isso?

Ankit Shah
fonte

Respostas:

18

Você precisa usar coleções para isso:

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

Isso pressupõe que você criou um modelo de recurso de coleção para sua Messagesentidade.

NB: tente evitar usar o Gerenciador de Objetos diretamente

Em vez disso, você pode injetar a classe de coleção no seu construtor :

protected $_messagesCollection;

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

E então você pode usar sua variável diretamente no seu código:

$messages = $this->_messagesCollection->addFieldToFilter('posts_id', $this->getRequest()->getParam('id'));
Raphael na Digital Pianism
fonte
12

Você não precisa usar a coleção para isso.

Basta chamar a loadfunção, com um segundo parâmetro, o campo

Injete a fábrica na construção em que você precisa recuperar seu modelo

protected $messagesFactory;

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

E então, onde você quiser:

$messages_model = $this->_messagesFactory->create();
$messages_model->load($the_id,'posts_id');
if(!$messages_model->getId()){
    echo "not found";
}
Pol Ravalitera
fonte
5
O método de carregamento do modelo está marcado como obsoleto. você deve usar o repositório
Sergey Korzhov
1
Sim, está obsoleto, mas nem todos os modelos têm o repositório relativo. Para evitar método que você deve usar a sua resourceModel obsoleta, você pode acessar a ResourceModel com ->getResource(), o código correto é$messages_model->getResource()->load($messages_model, $the_id, 'posts_id')
LucScu
@ LucScu Mas agora o método getResource () também fica obsoleto. Existe alguma ideia para carregar usando o ResourceModel?
Siranjeevi KS
0

Crie sua função nos arquivos de modelo e recurso.

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

No seu Modelo de Recurso

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;
}
Balaji Setti
fonte
2
esta solução também tem algumas desvantagens. O principal motivo é que o método de carregamento do modelo contém código importante que inicia o carregamento do modelo antes / depois dos eventos. Para saber mais sobre o
assunto
o uso do método load () na classe de modelo é depreciado.
Abhimanyu Singh