Tôi đã nhìn xung quanh lõi và thấy một vài ví dụ về nhiều mối quan hệ giữa nhiều người mẫu, nhưng tôi không thể thấy câu trả lời dứt khoát về điều này.
Ví dụ, giả sử chúng ta tạo một mô hình mới và chúng ta muốn có nhiều mối quan hệ với nhiều bảng sản phẩm hiện có.
Vì vậy, chúng tôi có Mô hình mới - Stockist và chúng tôi tạo 2 bảng như vậy, một bảng để lưu trữ tên Stockist, bàn còn lại để lưu trữ nhiều mối quan hệ với nhiều sản phẩm.
Phiên bản rút gọn của các lớp thiết lập:
$table = $setup->getConnection()
->newTable($installer->getTable('stockist'))
->addColumn('stockist_id',
\Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
null,
['identity' => true, 'unsigned' => true, 'nullable' => false, 'primary' => true],
'Stockist Id')
->addColumn('name',
\Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
null,
['nullable' => false],
'Stockist Name');
$table = $installer->getConnection()
->newTable($installer->getTable('stockist_product'))
->addColumn(
'entity_id',
\Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
null,
['identity' => true, 'nullable' => false, 'primary' => true],
'Entity ID'
)
->addColumn(
'stockist_id',
\Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
null,
['unsigned' => true, 'nullable' => false, 'primary' => true, 'default' => '0'],
'Stockist ID'
)
->addColumn(
'product_id',
\Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
null,
['unsigned' => true, 'nullable' => false, 'primary' => true, 'default' => '0'],
'Product ID'
)
->addIndex(
$installer->getIdxName('stockist_product', ['product_id']),
['product_id']
)
->addIndex(
$installer->getIdxName(
'stockist_product,
['stockist_id', 'product_id'],
\Magento\Framework\DB\Adapter\AdapterInterface::INDEX_TYPE_UNIQUE
),
['stockist_id', 'product_id'],
['type' => \Magento\Framework\DB\Adapter\AdapterInterface::INDEX_TYPE_UNIQUE]
)
->addForeignKey(
$installer->getFkName('stockist_product', 'product_id', 'catalog_product_entity', 'entity_id'),
'product_id',
$installer->getTable('catalog_product_entity'),
'entity_id',
\Magento\Framework\DB\Ddl\Table::ACTION_CASCADE
)
->addForeignKey(
$installer->getFkName('stockist_product', 'stockist_id', 'stockist', 'stockist_id'),
'stockist_id',
$installer->getTable('stockist'),
'stockist_id',
\Magento\Framework\DB\Ddl\Table::ACTION_CASCADE
)
->setComment('Stockist to Product Many to Many');
Sau đó, chúng tôi tạo một Model / ResourceModel / Collection tiêu chuẩn cho Stockist như sau:
namespace OurModule\Stockist\Model;
use Magento\Framework\Model\AbstractModel;
class Stockist extends AbstractModel
{
protected function _construct()
{
$this->_init('OurModule\Stockist\Model\ResourceModel\Stockist');
}
}
namespace OurModule\Stockist\Model\ResourceModel;
use Magento\Framework\Model\ResourceModel\Db\AbstractDb;
class Stockist extends AbstractDb
{
protected function _construct()
{
$this->_init('stockist', 'stockist_id');
}
}
namespace OurModule\Stockist\Model\ResourceModel\Stockist;
use Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection;
class Collection extends AbstractCollection
{
public function _construct()
{
$this->_init('OurModule\Stockist\Model\Stockist', 'OurModule\Stockist\Model\ResourceModel\Stockist');
}
}
Đây là nơi chúng ta đến để làm thế nào để xử lý bảng với nhiều mối quan hệ nhiều. Cho đến nay tôi đã nghĩ ra một cái gì đó dọc theo dòng này.
Tạo một mô hình để đại diện cho Stockist sản phẩm
namespace OurModule\Stockist\Model;
use Magento\Framework\Model\AbstractModel;
class StockistProduct extends AbstractModel
{
protected function _construct()
{
$this->_init('OurModule\Stockist\Model\ResourceModel\StockistProduct');
}
/**
* @param array $productIds
*/
public function getStockists($productIds)
{
return $this->_getResource()->getStockists($productIds);
}
/**
* @param array $stockistIds
*/
public function getProducts($stockistIds)
{
return $this->_getResource()->getProducts($stockistIds);
}
}
Ở đây xác định 2 phương thức sẽ lấy một mảng Id stockist, trả về một mảng Id sản phẩm phù hợp và ngược lại.
Điều này sử dụng Mô hình tài nguyên cho bảng stockist_product chứa nhiều mối quan hệ với nhiều:
/**
* Class StockistProduct
*/
class StockistProduct extends AbstractDb
{
/**
* Model initialization
*
* @return void
*/
protected function _construct()
{
$this->_init('stockist_product', 'entity_id');
}
/**
* Retrieve product stockist Ids
*
* @param array $productIds
* @return array
*/
public function getStockists(array $productIds)
{
$select = $this->getConnection()->select()->from(
$this->getMainTable(),
['product_id', 'stockist_id']
)->where(
'product_id IN (?)',
$productIds
);
$rowset = $this->getConnection()->fetchAll($select);
$result = [];
foreach ($rowset as $row) {
$result[$row['product_id']][] = $row['stockist_id'];
}
return $result;
}
/**
* Retrieve stockist product Ids
*
* @param array $stockistIds
* @return array
*/
public function getProducts(array $stockistIds)
{
$select = $this->getConnection()->select()->from(
$this->getMainTable(),
['product_id', 'stockist_id']
)->where(
'stockist_id IN (?)',
$stockistIds
);
$rowset = $this->getConnection()->fetchAll($select);
$result = [];
foreach ($rowset as $row) {
$result[$row['product_id']][] = $row['stockist_id'];
}
return $result;
}
}
Sau đó, sử dụng mô hình StockistSản phẩm này khi bạn cần truy xuất một bộ mô hình như vậy, giả sử chúng ta có Mô hình sản phẩm trong sản phẩm $ và $ stockistSản phẩm là một ví dụ của \ OurModule \ Stockist \ Model \ StockistS
$stockists = $stockistProduct->getStockists([$product->getId()]);
Sau đó, chúng ta có thể tạo lần lượt từng mô hình bằng cách lặp danh sách Id được trả về, trong đó $ stockistFactory là một phiên bản của \ OurModule \ Stockist \ Model \ StockistFactory
$stockist = $this->stockistFactory->create();
$stockist->load($stockistId);
Tất cả đều hoạt động tốt và dựa trên một số mã tương tự trong Core of Magento 2, nhưng tôi không thể tự hỏi liệu có cách nào tốt hơn không?