Magento2: Tải dữ liệu mô hình theo trường khác


8

Tôi có bảng dưới đây có tên "tin nhắn".

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

ứng dụng \ 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;

Tôi muốn lấy tin nhắn bằng Post_id. Làm thế nào tôi có thể có được điều đó?

Câu trả lời:


18

Bạn cần sử dụng các bộ sưu tập cho điều đó:

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

Điều này giả sử bạn đã tạo một mô hình tài nguyên bộ sưu tập cho Messagesthực thể của mình .

NB: vui lòng cố gắng tránh sử dụng Trình quản lý đối tượng trực tiếp

Thay vào đó, bạn có thể tiêm lớp bộ sưu tập trong hàm tạo của mình :

protected $_messagesCollection;

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

Và sau đó bạn có thể sử dụng biến của mình trực tiếp trong mã của mình:

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

12

Bạn không cần phải sử dụng bộ sưu tập cho điều đó.

Chỉ cần gọi loadhàm, với một tham số thứ hai, trường.

Tiêm nhà máy vào công trình nơi bạn cần lấy mô hình của mình

protected $messagesFactory;

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

Và sau đó, nơi bạn muốn nó:

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

5
phương pháp tải mô hình được đánh dấu là không dùng nữa. bạn nên sử dụng kho lưu trữ
Sergey Korzhov

1
vâng, nó không được chấp nhận, nhưng không phải tất cả các mô hình đều có repo tương đối. để tránh phương thức không dùng nữa, bạn nên sử dụng resourceModel của nó, bạn có thể truy cập vào ResourceModel với ->getResource(), mã đúng là$messages_model->getResource()->load($messages_model, $the_id, 'posts_id')
LucScu

@LucScu Nhưng bây giờ phương thức getResource () cũng bị phản đối. Có ý tưởng nào để tải bằng ResourceModel không?
Siranjeevi KS

0

Tạo chức năng của bạn trong Mô hình và tệp tài nguyên.

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

Trong mô hình tài nguyên của bạn

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
giải pháp này cũng có một số nhược điểm. Lý do chính là phương pháp tải mô hình chứa mã quan trọng khởi tạo tải mô hình trước / sau các sự kiện. nwdtheme.com/2017/06/10/magento-2-load-model-data-custom-field
Sergey Korzhov

sử dụng phương thức load () trong lớp mô hình được khấu hao.
Abhimanyu Singh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.