Magento 2: 補品をデヌタベヌスに盎接むンポヌトしたす

В 前の蚘事 通垞の方法 (モデルずリポゞトリを䜿甚) で補品を Magento 2 にむンポヌトするプロセスに぀いお説明したした。 通垞の方法ではデヌタ凊理速床が非垞に遅くなりたす。 私のラップトップは 2 秒あたり玄 XNUMX ぀の補品を生成しおいたした。 この続きでは、補品をむンポヌトする別の方法、぀たり暙準の Magento XNUMX メカニズム (モデル、ファクトリヌ、リポゞトリ) をバむパスしお、デヌタベヌスに盎接入力する方法を怜蚎したす。 補品をむンポヌトする䞀連の手順は、MySQL で動䜜する任意のプログラミング蚀語に適合させるこずができたす。

免責事項: Magento には既補の機胜がありたす。 デヌタむンポヌト そしおおそらく、あなたにずっおはそれで十分でしょう。 ただし、手持ちの CSV ファむルを準備するだけでなく、むンポヌト プロセスをより完党に制埡する必芁がある堎合は、cat ぞようこそ。

Magento 2: 補品をデヌタベヌスに盎接むンポヌトしたす

䞡方の蚘事を曞いた結果のコヌドは、Magento モゞュヌルで衚瀺できたす。フランサヌ32/mage2_ext_demo_import」。 デモ モゞュヌルのコヌドを簡玠化するために私が埓ったいく぀かの制限を次に瀺したす。

  • 補品は䜜成されるだけであり、曎新されたせん。
  • XNUMX぀の倉庫
  • カテゎリ名のみがむンポヌトされ、その構造はむンポヌトされたせん。
  • デヌタ構造はバヌゞョン 2.3 に準拠

単䞀の補品をむンポヌトするための JSON:

{
  "sku": "MVA20D-UBV-3",
  "name": "Заглушка Ўля плПЌбОрПвкО ВА47-29 IEK",
  "desc": "ОбеспечеМОе ЎПступа к устрПйстваЌ ...",
  "desc_short": "Заглушка Ўля плПЌбОрПвкО ВА47-29 IEK преЎМазМачеМа Ўля ...",
  "price": 5.00,
  "qty": 25,
  "categories": ["КатегПрОя 1", "КатегПрОя 2"],
  "image_path": "mva20d_ubv_3.png"
}

茞入の䞻な段階の抂芁

  • 補品自䜓の登録
  • 補品ずWebサむトの぀ながり
  • 基本的な補品属性 (EAV)
  • 圚庫デヌタ商品の圚庫数
  • メディア写真
  • カタログカテゎリヌずの関係

補品登録

基本的な補品情報は、 catalog_product_entity:

CREATE TABLE `catalog_product_entity` (
  `entity_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Entity Id',
  `attribute_set_id` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Attribute Set ID',
  `type_id` varchar(32) NOT NULL DEFAULT 'simple' COMMENT 'Type ID',
  `sku` varchar(64) DEFAULT NULL COMMENT 'SKU',
  `has_options` smallint(6) NOT NULL DEFAULT '0' COMMENT 'Has Options',
  `required_options` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Required Options',
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Creation Time',
  `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'Update Time',
  PRIMARY KEY (`entity_id`),
  KEY `CATALOG_PRODUCT_ENTITY_ATTRIBUTE_SET_ID` (`attribute_set_id`),
  KEY `CATALOG_PRODUCT_ENTITY_SKU` (`sku`)
)

補品レゞストリに゚ントリを䜜成するために必芁な最小限の情報は次のずおりです。

  • attribute_set_id
  • sku

远加

  • type_id — 指定しない堎合は、「simple」が䜿甚されたす

デヌタベヌスに盎接曞き蟌むには、Magento 自䜓の DB アダプタヌを䜿甚したす。

function create($sku, $typeId, $attrSetId)
{
    /** @var MagentoFrameworkAppResourceConnection $this->resource */
    /** @var MagentoFrameworkDBAdapterPdoMysql $conn */
    $conn = $this->resource->getConnection();
    $table = $this->resource->getTableName('catalog_product_entity');
    $bind = [
        'sku' => $sku,
        'type_id' => $typeId,
        'attribute_set_id' => $attrSetId
    ];
    $conn->insert($table, $bind);
    $result = $conn->lastInsertId($table);
    return $result;
}

で補品登録埌、 catalog_product_entity 管理パネルの補品グリッドに衚瀺されたす (カタログ・補品).

Magento 2: 補品をデヌタベヌスに盎接むンポヌトしたす

商品ずWebサむトの関係

補品ずサむトの関連付けにより、補品がどの店舗で販売され、店頭で展瀺されるかが決たりたす。

function linkToWebsite($prodId, $websiteId)
{
    /** @var MagentoFrameworkAppResourceConnection $this->resource */
    /** @var MagentoFrameworkDBAdapterPdoMysql $conn */
    $conn = $this->resource->getConnection();
    $table = $this->resource->getTableName('catalog_product_website');
    $bind = [
        'product_id' => $prodId,
        'website_id' => $websiteId
    ];
    $conn->insert($table, $bind);
}

Magento 2: 補品をデヌタベヌスに盎接むンポヌトしたす

基本的な補品特性

新しく登録された補品にはただ名前も説明もありたせん。 これはすべお、 EAV 属性。 補品を前面に正しく衚瀺するために必芁な基本的な補品属性のリストを次に瀺したす。

  • name
  • price
  • description
  • short_description
  • status
  • tax_class_id
  • url_key
  • visibility

次のように、別の属性がプロダクトに远加されたす (コヌドから属性の識別子ずタむプを取埗する詳现は省略したす)。

public function create($prodId, $attrCode, $attrValue)
{
    $attrId = /* get attribute ID by attribute code */
    $attrType = /* get attribute type [datetime|decimal|int|text|varchar]) by attribute code */
    if ($attrId) {
        /** @var MagentoFrameworkAppResourceConnection $this->resource */
        /** @var MagentoFrameworkDBAdapterPdoMysql $conn */
        $conn = $this->resource->getConnection();
        $tblName = 'catalog_product_entity_' . $attrType;
        $table = $this->resource->getTableName($tblName);
        $bind = [
            'attribute_id' => $attrId,
            'entity_id' => $prodId,
            /* put all attributes to default store view with id=0 (admin) */
            'store_id' => 0,
            'value' => $attrValue
        ];
        $conn->insert($table, $bind);
    }
}

属性コヌドを䜿甚しお、その ID ずデヌタ型を決定したす (datetime, decimal, int, text, varchar)、管理りィンドりのデヌタを適切なテヌブル (store_id = 0).

䞊蚘の属性を補品に远加するず、管理パネルに次の画像が衚瀺されたす。

Magento 2: 補品をデヌタベヌスに盎接むンポヌトしたす

むンベントリデヌタ

Magento のバヌゞョン 2.3 以降、圚庫情報 (補品数量) のストレヌゞを提䟛する XNUMX ぀の䞊列テヌブル セットがありたす。

  • cataloginventory_*叀い構造。
  • inventory_*: 新しい構造 (MSI - マルチ゜ヌスむンベントリ);

䞡方の構造に圚庫デヌタを远加する必芁がありたす。 新しい構造はただ叀い構造から完党に独立しおいたせんおそらく、 default 新しい構造の倉庫にはテヌブルが含たれたす cataloginventory_stock_status ずしお inventory_stock_1).

カタログ圚庫_

Magneto 2.3 をデプロむする堎合、最初は 2 ぀の゚ントリがありたす。 store_website、これは XNUMX ぀のサむト (管理クラむアントずメむン クラむアント) に察応したす。

website_id|code |name        |sort_order|default_group_id|is_default|
----------|-----|------------|----------|----------------|----------|
         0|admin|Admin       |         0|               0|         0|
         1|base |Main Website|         0|               1|         1|

テヌブル cataloginventory_stock ゚ントリは XNUMX ぀だけです。

stock_id|website_id|stock_name|
--------|----------|----------|
       1|         0|Default   |

぀たり、私たちの叀い構造には「倉庫」が XNUMX ぀しかありたせん (stockから管理サむトぞリンクしおおりたす。 管理パネルから新しいものを远加する sources/stocks MSI (新しい構造) では、新しい゚ントリは生成されたせん。 cataloginventory_stock.

叀い構造の補品に関する圚庫デヌタは、最初はテヌブルに蚘録されたす。

  • cataloginventory_stock_item
  • cataloginventory_stock_status

カタログ圚庫_圚庫_品目

function createOldItem($prodId, $qty)
{
    $isQtyDecimal = (((int)$qty) != $qty);
    $isInStock = ($qty > 0);
    /** @var MagentoFrameworkAppResourceConnection $this->resource */
    /** @var MagentoFrameworkDBAdapterPdoMysql $conn */
    $conn = $this->resource->getConnection();
    $table = $this->resource->getTableName('cataloginventory_stock_item');
    $bind = [
        'product_id' => $prodId,
        /* we use one only stock in 'cataloginventory' structure by default */
        'stock_id' => 1,
        'qty' => $qty,
        'is_qty_decimal' => $isQtyDecimal,
        'is_in_stock' => $isInStock,
        /* default stock is bound to admin website (see `cataloginventory_stock`) */
        'website_id' => 0
    ];
    $conn->insert($table, $bind);
}

カタログ圚庫_圚庫_ステヌタス

function createOldStatus($prodId, $qty)
{
    $isInStock = ($qty > 0);
    /** @var MagentoFrameworkAppResourceConnection $this->resource */
    /** @var MagentoFrameworkDBAdapterPdoMysql $conn */
    $conn = $this->resource->getConnection();
    $table = $this->resource->getTableName('cataloginventory_stock_status');
    $bind = [
        'product_id' => $prodId,
        /* we use one only stock in 'cataloginventory' structure by default */
        'stock_id' => 1, 
        'qty' => $qty,
        'stock_status' => MagentoCatalogInventoryApiDataStockStatusInterface::STATUS_IN_STOCK,
        /* default stock is bound to admin website (see `cataloginventory_stock`) */
        'website_id' => 0 
    ];
    $conn->insert($table, $bind);
}

圚庫_

最初は、圚庫デヌタを保存するための新しい構造には 1 ぀の "゜ヌス」inventory_source):

source_code|name          |enabled|description   |latitude|longitude|country_id|...|
-----------|--------------|-------|--------------|--------|---------|----------|...|
default    |Default Source|      1|Default Source|0.000000| 0.000000|US        |...|

そしおXNUMX぀」倉庫」inventory_stock):

stock_id|name         |
--------|-------------|
       1|Default Stock|

«゜ヌス» 補品の物理的な保管堎所を衚したす (レコヌドには物理的な座暙ず郵送先䜏所が含たれたす)。 」倉庫"は、耇数の "゜ヌス" の論理結合です (inventory_source_stock_link)

link_id|stock_id|source_code|priority|
-------|--------|-----------|--------|
      1|       1|default    |       1|

販売チャネルずの぀ながりが発生するレベルinventory_stock_sales_channel)

type   |code|stock_id|
-------|----|--------|
website|base|       1|

デヌタ構造から刀断するず、さたざたな販売チャネルが想定されたすが、デフォルトでは接続のみです。株匏「-」りェブサむト"(Web サむトぞのリンクは Web サむトのコヌドに埓いたす - base).

XNUMX぀ "倉庫「耇数にリンクできる」゜ヌス「そしお䞀぀」゜ヌス「数件たで」倉庫"(倚察倚の関係)。 䟋倖はデフォルトです。」゜ヌス"そしお"倉庫」。 これらは他の゚ンティティに再リンクされたせん (コヌド レベルでの制限 - ゚ラヌ「デフォルトの゜ヌスたたはデフォルトのストックに関連するリンクを保存できたせん")。 Magento 2 の MSI 構造の詳现に぀いおは、蚘事「CQRSずむベント゜ヌシングを䜿甚した倉庫管理システム。 デザむン"

デフォルトの構成を䜿甚し、すべおのむンベントリ情報を゜ヌスに远加したす。 default、コヌドを持぀ Web サむトに関連付けられた販売チャネルに関䞎しおいたす base (ストアのフロント゚ンドに盞圓したす - を参照しおください) store_website):

function createNewItem($sku, $qty)
{
    /** @var MagentoFrameworkAppResourceConnection $this->resource */
    /** @var MagentoFrameworkDBAdapterPdoMysql $conn */
    $conn = $this->resource->getConnection();
    $table = $this->resource->getTableName('inventory_source_item');
    $bind = [
        'source_code' => 'default',
        'sku' => $sku,
        'quantity' => $qty,
        'status' => MagentoInventoryApiApiDataSourceItemInterface::STATUS_IN_STOCK
    ];
    $conn->insert($table, $bind);
}

管理パネルで補品に圚庫デヌタを远加するず、次の図が衚瀺されたす。

Magento 2: 補品をデヌタベヌスに盎接むンポヌトしたす

メディア

管理パネルを通じお補品に画像を「手動」で远加するず、関連情報が次の衚に曞き蟌たれたす。

  • catalog_product_entity_media_gallery: メディア レゞストリ (画像およびビデオ ファむル);
  • catalog_product_entity_media_gallery_value: メディアを補品やショヌケヌスにリンクする (ロヌカリれヌション)。
  • catalog_product_entity_media_gallery_value_to_entity: メディアを補品のみにリンクしたす (おそらく補品のデフォルトのメディア コンテンツ)。
  • catalog_product_entity_varchar: 画像が䜿甚される圹割がここに保存されたす。

画像自䜓はディレクトリに保存されたす ./pub/media/catalog/product/x/y/どこ x О y — 画像ファむル名の最初ず XNUMX 文字目。 たずえば、ファむル image.png ずしお保存する必芁がありたす ./pub/media/catalog/product/i/m/image.png、プラットフォヌムがカタログの補品を説明するずきに画像ずしお䜿甚できるようにしたす。

に投皿された登録 ./pub/media/catalog/product/ メディア ファむル (ファむル自䜓を配眮するプロセスに぀いおは、この蚘事では説明したせん):

function createMediaGallery($imgPathPrefixed)
{
    $attrId = /* get attribute ID by attribute code 'media_gallery' */
    /** @var MagentoFrameworkAppResourceConnection $this->resource */
    /** @var MagentoFrameworkDBAdapterPdoMysql $conn */
    $conn = $this->resource->getConnection();
    $table = $this->resource->getTableName('catalog_product_entity_media_gallery');
    $bind = [
        'attribute_id' => $attrId,
        'value' => $imgPathPrefixed,
        /* 'image' or 'video' */
        'media_type' => 'image',
        'disabled' => false
    ];
    $conn->insert($table, $bind);
    $result = $conn->lastInsertId($table);
    return $result;
}

登録されるず、新しいメディア ファむルには識別子が割り圓おられたす。

登録されたメディア ファむルを、デフォルトのストアフロントの察応する補品に関連付けたす。

function createGalleryValue($mediaId, $prodId)
{
    /** @var MagentoFrameworkAppResourceConnection $this->resource */
    /** @var MagentoFrameworkDBAdapterPdoMysql $conn */
    $conn = $this->resource->getConnection();
    $table = $this->resource->getTableName('catalog_product_entity_media_gallery_value');
    $bind = [
        'value_id' => $mediaId,
        /* use admin store view by default */
        'store_id' => 0,
        'entity_id' => $prodId,
        'label' => null,
        /* we have one only image */
        'position' => 1,
        'disabled' => false
    ];
    $conn->insert($table, $bind);
}

店頭に瞛られるこずなく、登録されたメディア ファむルを察応する補品に関連付けたす。 このデヌタが正確にどこで䜿甚されるのか、なぜ前のテヌブルのデヌタにアクセスできないのかは䞍明ですが、このテヌブルは存圚し、補品に画像が远加されるずきにデヌタが曞き蟌たれたす。 それで終わりです。

function createGalleryValueToEntity($mediaId, $prodId)
{
    /** @var MagentoFrameworkAppResourceConnection $this->resource */
    /** @var MagentoFrameworkDBAdapterPdoMysql $conn */
    $conn = $this->resource->getConnection();
    $table = $this->resource->getTableName('catalog_product_entity_media_gallery_value_to_entity');
    $bind = [
        'value_id' => $mediaId,
        'entity_id' => $prodId
    ];
    $conn->insert($table, $bind);
}

カタログ_補品_゚ンティティ_varchar

メディア ファむルはさたざたな圹割で䜿甚できたす (察応する属性コヌドが括匧内に瀺されおいたす)。

  • ベヌスimage)
  • 小さい画像 (small_image)
  • サムネむル (thumbnail)
  • スりォッチ画像 (swatch_image)

圹割をメディア ファむルにリンクするず、たさに次のこずが起こりたす。 catalog_product_entity_varchar。 バむンディング コヌドは、「」のコヌドず䌌おいたす。基本的な補品特性"

管理パネルで補品に画像を远加するず、次のようになりたす。

Magento 2: 補品をデヌタベヌスに盎接むンポヌトしたす

КатегПрОО

カテゎリ別のデヌタを含む䞻なテヌブル:

  • catalog_category_entity: カテゎリの登録。
  • catalog_category_product: 補品ずカテゎリヌ間の぀ながり。
  • catalog_category_entity_*: EAV 属性倀。

最初、空の Magento アプリケヌションでは、カテゎリ レゞストリに 2 ぀のカテゎリが含たれおいたす (列名を短瞮したした: crt - created_at, upd - updated_at):

entity_id|attribute_set_id|parent_id|crt|upd|path|position|level|children_count|
---------|----------------|---------|---|---|----|--------|-----|--------------|
        1|               3|        0|...|...|1   |       0|    0|             1|
        2|               3|        1|...|...|1/2 |       1|    1|             0|

id=1 のカテゎリは Magento カタログ党䜓のルヌトであり、管理パネルにもフロントペヌゞにもありたせん。 ID=2 のカテゎリ (既定のカテゎリ) は、メむン サむトのメむン ストア (メむンりェブサむトストア) アプリケヌションのデプロむ時に䜜成されたす (「. 管理者 / ストア / すべおのストア。 さらに、ストア自䜓のルヌト カテゎリもフロントでは利甚できず、そのサブカテゎリのみが利甚可胜です。

この蚘事のテヌマは匕き続き補品のデヌタのむンポヌトであるため、カテゎリを䜜成するずきにデヌタベヌスぞの盎接入力は䜿甚せず、Magento 自䜓が提䟛するクラス (モデルずリポゞトリ) を䜿甚したす。 デヌタベヌスぞの盎接入力は、むンポヌトされた補品をカテゎリに関連付けるためにのみ䜿甚されたす (カテゎリは名前によっお照合され、カテゎリ ID は照合䞭に取埗されたす)。

function create($prodId, $catId)
{
    /** @var MagentoFrameworkAppResourceConnection $this->resource */
    /** @var MagentoFrameworkDBAdapterPdoMysql $conn */
    $conn = $this->resource->getConnection();
    $table = $this->resource->getTableName('catalog_category_product');
    $bind = [
        'category_id' => $catId,
        'product_id' => $prodId,
    ];
    $conn->insert($table, $bind);
}

カテゎリ「カテゎリ 1」ず「カテゎリ 2」に補品リンクを远加するず、管理パネルの補品詳现は次のようになりたす。

Magento 2: 補品をデヌタベヌスに盎接むンポヌトしたす

远加のアクション

デヌタのむンポヌトが完了したら、次の远加手順を完了する必芁がありたす。

  • デヌタのむンデックス䜜成:コン゜ヌルでの呌び出し ./bin/magento indexer:reindex;
  • 補品/カテゎリの URL を再生成: 拡匵子「」を䜿甚できたす。elgentos/regenerate-catalog-urls«

远加のアクションを実行した埌の管理パネルの補品:

Magento 2: 補品をデヌタベヌスに盎接むンポヌトしたす

そしお正面には

Magento 2: 補品をデヌタベヌスに盎接むンポヌトしたす

サマリヌ

前の蚘事ず同じ補品セット (10 個) は、少なくずも 1 桁速くむンポヌトされたす (10 個に察しお XNUMX 秒)。 速床をより正確に芋積もるには、より倚くの補品 (数癟、できれば数千) が必芁です。 ただし、入力デヌタのサむズがこのように小さい堎合でも、Magento が提䟛するツヌル (モデルずリポゞトリ) の䜿甚は重芁であるず結論付けるこずができたす (匷調したす - はるかに!) 必芁な機胜の開発をスピヌドアップしたすが、同時に倧幅に (匷調したす - はるかに!) デヌタがデヌタベヌスに入る速床を䞋げたす。

その結果、氎は濡れおいるこずが刀明したしたが、これは啓瀺ではありたせん。 しかし、今ではコヌドをいじっおみるず、もっず興味深い結論に達するかもしれたせん。

出所 habr.com