回答:
@mpaepperの回答を使用して、正しい情報を取得しているように見えるクエリを取得できました。2つの異なるmagentoデータベースでテストすることができ、それぞれが正しく見えました。とにかくここです。
SELECT DISTINCT cc.entity_id as id, cc.value as path, cc1.value as name
FROM catalog_category_entity_varchar cc
JOIN catalog_category_entity_varchar cc1 ON cc.entity_id=cc1.entity_id
JOIN eav_entity_type ee ON cc.entity_type_id=ee.entity_type_id
JOIN catalog_category_entity cce ON cc.entity_id=cce.entity_id
WHERE cc.attribute_id = '57' AND cc1.attribute_id = '41' AND ee.entity_model = 'catalog/category';
おそらくeav_entity_typeに参加する必要はなかったでしょうが、おそらく別のバージョンのmagentoでこのクエリを再び使用するので、クエリを再利用可能に保つのに役立つと思います。
さて、ここにテーブルとあなたがする必要があるものがあります(私はあなたにMySQLの参加をあなたに楽しませます;)):
catalog_category_entity
カテゴリID(entity_id
)を持つベーステーブルです。
あなたは、その後の属性IDを識別するために必要name
とurl_path
テーブルからeav_attribute
。
私の場合、attribute_code
name
for entity_type_id 3(私にとっては3はカテゴリーです。テーブルeav_entity_typeで調べてください)はattribute_id
41です。私の場合、attribute_code
url_path
for entity_type_id 3はattribute_id 57です。
name
とurl_path
のタイプはどちらもvarcharであるため、catalog_category_entity_varchar
(attribute_idおよびentity_idのフィルター、entity_idはカテゴリの対応するID)に値が表示されます。
したがって、catalog_category_entity
テーブルを使用catalog_category_entity_varchar
して、entity_id
as結合条件で2回結合し、ルックアップできるattribute_idsを指定する必要があります。または、さらに結合を行うことができるため、以前にIDを検索せずに結合します。
楽しんで!:)
SELECT DISTINCT cc.entity_id as category_id, cc.value as name, cc1.value as
url_path ,cce.parent_id as parent_id ,0 as top,level as `column`,position as
sort_order,1 as status,created_at as date_added,updated_at as date_modified
FROM catalog_category_entity_varchar cc
JOIN catalog_category_entity_varchar cc1 ON cc.entity_id=cc1.entity_id
JOIN catalog_category_entity_int cc_int ON cc1.entity_id=cc_int.entity_id
JOIN eav_entity_type ee ON cc.entity_type_id=ee.entity_type_id JOIN catalog_category_entity cce ON cc.entity_id=cce.entity_id
WHERE cc.attribute_id in (select attribute_id from eav_attribute where attribute_code ='name') AND cc1.attribute_id in (select attribute_id from eav_attribute where attribute_code ='url_path')
and cc_int.attribute_id in (select attribute_id from eav_attribute where attribute_code ='is_active')
and cc_int.value = 1
and ((cce.parent_id = 2 and cce.children_count > 1) or cce.parent_id > 2)
AND ee.entity_model = 'catalog/category' order by cce.parent_id asc,
cce.position asc;
すべてのメインカテゴリを取得するには、以下のクエリを使用します
select *
from catalog_category_flat_store_1
where level = 2 and
is_active = 1
order by parent_id asc, position asc;
レベルを適宜変更してください
Magentoのカテゴリデータをデータベースから直接取得するには、次のようにします。
select
p.entity_id as entity_id,
if(pp.level = 1,
n.value,
concat_ws (' / ', pn.value, n.value)) as name,
date(p.created_at) as created_at
from
catalog_category_entity p
-- name
left join catalog_category_entity_varchar n on
p.entity_id = n.entity_id and n.attribute_id = 41
-- status
left join catalog_category_entity_int s on
p.entity_id = s.entity_id and s.attribute_id = 42 and
s.store_id = 0
-- parent
left join catalog_category_entity pp on p.parent_id = pp.entity_id
-- parent name
left join catalog_category_entity_varchar pn on
pp.entity_id = pn.entity_id and pn.attribute_id = 41 and
pn.store_id = 0
where
s.value = 1 and -- status is active
p.level >= 2
order by
2
;
Attribute_idはシステムごとに異なります。ここでは41と42を使用しています。
Magentoサイトからカテゴリ名とカテゴリステータスの正しいattribute_idを特定するために、以下を使用します。
select
p.entity_id,
a.attribute_id,
a.frontend_label as attribute,
av.value
from
catalog_category_entity p
left join catalog_category_entity_{datatype} av on
p.entity_id = av.entity_id
left join eav_attribute a on
av.attribute_id = a.attribute_id
where
p.entity_id = {eid}
;
{datatype}を「varchar」で置き換えることにより、カテゴリ名のattribute_idを取得でき、「int」でカテゴリステータスのattribute_idを取得できます。任意のカテゴリentity_idを{eid}で置き換えることができます。
これは、エディタまたはコマンドラインで、次のようにsedを使用して実行できます。
wdbが次のようにWebサイトのmysqlデータベース接続に設定されたエイリアスであると想定します。
alias wdb='mysql -h<hostname> -u<username> -p<password> <databasename>'
その後、実行できます
$ cat show_category_attr.sql | sed -e "s/{datatype}/varchar/" -e "s/{eid}/2/" | wdb -t
そして得る
+-----------+--------------+--------------+------------------+
| entity_id | attribute_id | attribute | value |
+-----------+--------------+--------------+------------------+
| 2 | 41 | Name | Default Category |
| 2 | 49 | Display Mode | PRODUCTS |
+-----------+--------------+--------------+------------------+
そして走る
$ cat show_category_attr.sql | sed -e "s/{datatype}/int/" -e "s/{eid}/2/"| wdb -t
そして得る
+-----------+--------------+----------------------------+-------+
| entity_id | attribute_id | attribute | value |
+-----------+--------------+----------------------------+-------+
| 2 | 42 | Is Active | 1 |
| 2 | 67 | Include in Navigation Menu | 1 |
+-----------+--------------+----------------------------+-------+
ここでは、必要な番号41と42を確認できます。
Magento製品にも同じ手法を使用できます。
Magento 2では、entity_type_idはcatalog_category_entity_varcharテーブルでは使用できないため、グーグル検索して、必要なものを取得するために中間テーブルeav_attributeを見つける必要があります。Entity_idもMagento 2のRow_Idに置き換えられます
SELECT DISTINCT cc.Row_id as category_id, cc.value as image, cc1.value as
title ,cce.parent_id as parent_id ,0 as top,level as `column`,position as
sort_order,1 as status,created_at as date_added,updated_at as date_modified
FROM catalog_category_entity_varchar cc
JOIN catalog_category_entity_varchar cc1 ON cc.Row_id=cc1.Row_id
JOIN catalog_category_entity_int cc_int ON cc1.Row_id=cc_int.Row_id
join eav_attribute as att on att.`attribute_id` = cc.`attribute_id`
JOIN eav_entity_type ee ON att.entity_type_id=ee.entity_type_id JOIN catalog_category_entity cce ON cc.Row_id=cce.Row_id
WHERE cc.attribute_id in (select distinct attribute_id from eav_attribute where attribute_code ='name')
AND cc1.attribute_id in (select attribute_id from eav_attribute where attribute_code ='url_path')
and cc_int.attribute_id in (select attribute_id from eav_attribute where attribute_code ='is_active')
and cc_int.value = 1
and ((cce.parent_id = 2 and cce.children_count > 1) or cce.parent_id > 2)
#AND ee.entity_model = 'Magento\Catalog\Model\ResourceModel\Category'
order by cce.parent_id asc,
cce.position asc;
必要なものを手に入れるのを手伝ってくれてありがとう。:)
Magento 2の場合。IDとURLパスとともにカテゴリ名の完全なリストを取得するには:
SELECT entity_id AS "CATEGORY ID", ccev1.value as "CATEGORY NAME", CONCAT(ccev2.value, ".html") AS "CATEGORY PATH"
FROM catalog_category_entity AS cce
JOIN catalog_category_entity_varchar AS ccev1 USING (entity_id)
JOIN catalog_category_entity_varchar AS ccev2 USING (entity_id)
JOIN eav_attribute AS ea1 ON ea1.attribute_id = ccev1.attribute_id
JOIN eav_attribute AS ea2 ON ea2.attribute_id = ccev2.attribute_id
WHERE ea1.attribute_code = 'name' AND ea1.entity_type_id = 3 AND ea2.attribute_code = 'url_path' AND ea1.entity_type_id = 3
ORDER BY entity_id
これはカテゴリIDで並べ替えられます。名前で並べ替える場合は、 "ORDER BY entity_id"を "ORDER BY ccev1.value"に変更します。