web-dev-qa-db-ja.com

magentoテーブル構造から顧客情報を取得する

Magentoテーブルからすべての顧客詳細の行を取得したい。

誰でも私にクエリを与えることができますか?

テーブルは次のとおりです。

  • customer_entity
  • eav_attribute
  • customer_entity_varchar
15
user319198

Magento MySQL DBから一部のデータを抽出することは可能ですが、以下のクエリを実行する前に、次のことに注意してください。

1)Magentoは構成可能に構築されているため、MySQLからデータをフェッチすることはできませんが、Magento Customerモジュール(モデル、リソースモデル)とMagento構成データを使用して顧客データを取得する必要があります。ストレートクエリは、Magentoの異なるバージョンや、同じバージョンのインストールとの互換性が保証されていません。

2)Magento EAV構造では、テーブル名は属性に動的に一致するため、1つのクエリ内ですべての顧客データをNiceフォームでフェッチすることはできません。

3)1つのクエリだけで、または複数のクエリですべての顧客データを抽出することはできません。多くの情報オブジェクトはモデル内で作成され、モデルのみが1つの顧客オブジェクト内のすべてのデータを収集するロジックを持っているためです。配送先/請求先住所、ストアクレジット、ポイント(EEバージョンの場合)などについて話します。

ただし、すべての顧客のvarchar属性を取得するためだけに、次のコードを使用できます(1で前述したため、動作が保証されていません)。

SELECT ce.*, ea.attribute_code, cev.value
  FROM customer_entity AS ce 
  LEFT JOIN eav_attribute AS ea ON ce.entity_type_id = ea.entity_type_id AND ea.backend_type = 'varchar'
  LEFT JOIN customer_entity_varchar AS cev ON ce.entity_id = cev.entity_id AND ea.attribute_id = cev.attribute_id

また、このようなクエリを使用して、顧客のすべての属性を抽出することもできます。

SELECT ce.*, ea.attribute_code, 
    CASE ea.backend_type 
       WHEN 'varchar' THEN ce_varchar.value
       WHEN 'int' THEN ce_int.value
       WHEN 'text' THEN ce_text.value
       WHEN 'decimal' THEN ce_decimal.value
       WHEN 'datetime' THEN ce_datetime.value
       ELSE NULL
    END AS value
  FROM customer_entity AS ce 
  LEFT JOIN eav_attribute AS ea ON ce.entity_type_id = ea.entity_type_id
  LEFT JOIN customer_entity_varchar AS ce_varchar ON ce.entity_id = ce_varchar.entity_id AND ea.attribute_id = ce_varchar.attribute_id AND ea.backend_type = 'varchar'
  LEFT JOIN customer_entity_int AS ce_int ON ce.entity_id = ce_int.entity_id AND ea.attribute_id = ce_int.attribute_id AND ea.backend_type = 'int'
  LEFT JOIN customer_entity_text AS ce_text ON ce.entity_id = ce_text.entity_id AND ea.attribute_id = ce_text.attribute_id AND ea.backend_type = 'text'
  LEFT JOIN customer_entity_decimal AS ce_decimal ON ce.entity_id = ce_decimal.entity_id AND ea.attribute_id = ce_decimal.attribute_id AND ea.backend_type = 'decimal'
  LEFT JOIN customer_entity_datetime AS ce_datetime ON ce.entity_id = ce_datetime.entity_id AND ea.attribute_id = ce_datetime.attribute_id AND ea.backend_type = 'datetime'
25
Andrey Tserkus

@Stefanoの応答を補足するために、住所や電話などのその他の重要な詳細を抽出するために、大きなクエリを作成しました。これらの詳細の一部は私のデータベースでのみ意味がありますが、誰かを助けることができます:

SELECT c.entity_id,c.email, 
            (
            SELECT fn.value
            FROM customer_entity_varchar fn
            WHERE c.entity_id = fn.entity_id AND 
             fn.attribute_id = 12) AS password_hash, 
             (
            SELECT fn.value
            FROM customer_entity_varchar fn
            WHERE c.entity_id = fn.entity_id AND
             fn.attribute_id = 5) AS name, 
             (
            SELECT fn.value
            FROM customer_entity_varchar fn
            WHERE c.entity_id = fn.entity_id AND 
             fn.attribute_id = 7) AS lastname,
             (
            SELECT fn.value
            FROM customer_entity_varchar fn
            WHERE c.entity_id = fn.entity_id AND 
             fn.attribute_id = 150) AS cpfcnpj, 
             (
            SELECT fn.value
            FROM customer_address_entity_varchar fn
            WHERE ca.entity_id = fn.entity_id AND 
             fn.attribute_id = 149) AS cpfcnpj2,
             (
            SELECT fn.value
            FROM customer_address_entity_varchar fn
            WHERE ca.entity_id = fn.entity_id AND 
             fn.attribute_id = 145) AS rg,
             (
            SELECT fn.value
            FROM customer_address_entity_varchar fn
            WHERE ca.entity_id = fn.entity_id AND 
             fn.attribute_id = 151) AS phone1,
             (
            SELECT fn.value
            FROM customer_address_entity_varchar fn
            WHERE ca.entity_id = fn.entity_id AND 
             fn.attribute_id = 31) AS phone2,
             (
            SELECT fn.value
            FROM customer_address_entity_varchar fn
            WHERE ca.entity_id = fn.entity_id AND 
             fn.attribute_id = 27) AS country,
             (
            SELECT fn.value
            FROM customer_address_entity_varchar fn
            WHERE ca.entity_id = fn.entity_id AND 
             fn.attribute_id = 28) AS state,
             (
            SELECT fn.value
            FROM customer_address_entity_varchar fn
            WHERE ca.entity_id = fn.entity_id AND 
             fn.attribute_id = 26) AS city,                 
             cat.value AS address,
             (
            SELECT fn.value
            FROM customer_address_entity_varchar fn
            WHERE ca.entity_id = fn.entity_id AND 
             fn.attribute_id = 30) AS cep
            FROM customer_entity AS c
            LEFT JOIN customer_address_entity AS ca ON c.entity_id = ca.parent_id
            LEFT JOIN customer_address_entity_text AS cat ON cat.entity_id = ca.entity_id                

            GROUP BY entity_id
8

これは、magentoテーブルから顧客の詳細を抽出するための小さなクエリです。

select c.*, 
  (select fn.value from customer_entity_varchar fn where c.entity_id = fn.entity_id and
    fn.attribute_id = 5) as Name, 
  (select fn.value from customer_entity_varchar fn where c.entity_id = fn.entity_id and 
    fn.attribute_id = 7) as Lastname
from customer_entity c
7

上記の内容を読んだところ、問題を自分で解決しようとしている人がいることを知って、気分が良くなりました。まあ、ご存知かもしれませんが、magentoバックオフィスではクライアントに関するすべての情報を見つけることができません。すべてのクライアント(アカウント=登録済みのクライアント)(およびニュースレターnewsletter_subscribersに登録したばかりのクライアント)を表示できる非常に大きなテーブルが必要でした

Magentoがこれらの情報をどのように提供するのか本当にわからないので、データを抽出するsom SQLコードを記述しました。

上記のとおり、クライアントに関するすべての情報を1つのクエリで取得することはできません。実際には、クライアントの属性と同じ数のクエリが必要になります。エンティティクライアントに45の属性(name、lastname、middlename、email .....)がある場合、それらを抽出するために45のクエリが必要になります...私の質問はHOW ???

答えはVIEWSです!!実際、私は各属性情報を抽出するビューを書きました。つまり、45件のビューを作成し、各ビューが属性を選択することを意味します

データベースでそれがどのように行われるかはわかりませんが、各エンティティにはentity_type_idがあることを知っているかもしれません。私の場合、customer_entityとcustomer_address_entityに興味があります。 customer_entityにはentity_type_id = 1があり、customer_address_entityにはentity_type_id = 2があります

各エンティティには属性があります。したがって、顧客エンティティで使用可能な属性を確認する場合は、クエリを実行します。

Select attribute_code, attribute_id, backend_type from eav_attribute where entity_type_id =1アドレスエンティティについても、1を2に置き換えることで同じです。

列attributes_idは非常に重要です。これにより、テーブルのidで属性を検索できるようになります。entity_customer_vachar、entity_customer_int、entity_customer_text、entity_customer_datetime ..

情報は、上記の表のタイプ別にディスパッチされます。上記のクエリを実行すると、各属性にbackendtypeがあることがわかります。つまり、探している情報は、そのタイプのサフィックスが付いたテーブルの1つです。たとえば、varchar型のfirstnameを探している場合、customer_entity_varcharなどで見つかります。

あなたがまだ読んでいるなら、それはあなたが私が話していることを理解していることを意味するかもしれません。それ以外の場合は、EAVモデルとmagento 1.3.2.4データベーススキーマを http://inchoo.net/wp-content/uploads/2010/09/MAGENTO_v1.3.2.4-Database_Diagram.pdfで確認する必要があります。

まだ準備ができていないため、ソリューション全体を投稿することはできません。それが役立つ場合は、Zipファイルを配置します。

一方、誰かがmagentoオブジェクトをphpファイルで使用して、magento Coreを編集せずにデータにアクセスする方法を知っているなら、それは素晴らしいことです!ありがとう

3
Mehdi

私は特にMagentoストアから顧客の携帯電話番号をエクスポートしようとしていました。

まず、顧客データセットに拡張されるため、データプロファイルを使用してこれを行うことができます。

私の場合、データプロファイル機能が何らかの理由で機能していなかったため、MySQLに直接アクセスしてデータを取得する理由を理解する時間がありませんでした。

次のMySQLクエリを使用すると、英国の携帯電話番号を持つ顧客を抽出できます。注:必要なデータがどのattribute_idであるかを調べ、それに応じてクエリで更新する必要がある場合があります。

attribute_id value
26 Country
19 First_Name
21 Surname
31 Telephone

クエリ:-

SELECT 
`firstname`.`value` as `First_Name`, 
`surname`.`value` as `Surname`, 
`telephone`.`value` as `Telephone`,
`customer_entity`.`created_at`,
`customer_entity`.`updated_at` 
FROM 
`customer_address_entity_varchar` as `country` 
INNER JOIN 
`customer_address_entity_varchar` as  `firstname` USING (`entity_id`) 
INNER JOIN 
`customer_address_entity_varchar` as  `surname` USING (`entity_id`) 
INNER JOIN 
`customer_address_entity_varchar` as  `telephone` USING (`entity_id`) 
INNER JOIN 
`customer_entity` USING (`entity_id`) 
WHERE 
`country`.`attribute_id` = 26 && 
`country`.`value`="GB" && 
`firstname`.`attribute_id` = 19  && 
`surname`.`attribute_id` = 21  && 
`telephone`.`attribute_id` = 31  && 
`telephone`.`value` LIKE "07%"  
GROUP BY `telephone`.`value` 
limit 0,10;

制限とwhereステートメントが結果を特定のデータに制限していることに注意してください。グループは、実際のデータが電話番号であるため、重複した番号を停止します。 INTO OUTFILEを追加して、結果セットをCSVにエクスポートできます。

これが誰かを助けることを願っています...

2
Flipmedia

これまたはいくつかのMagentoコードの実際のSQLを探していますか?実際のSQLは乱雑になり、おそらく望んでいるようには見えません。

MySQLには「ピボット」がないため、実際のクエリでは基本的にeav_attributeを無視できます。これを見て、必要な属性IDを見つけます。このデータを選択する方法の簡単な例を次に示します。

select c.*, fn.value firstname
    from customer_entity c
    join customer_entity_varchar fn
        on c.entity_id = fn.entity_id and fn.attribute_id = 5
;

すべての属性にこれらの結合句を追加し続けると、クエリが作成されます。基本的に、EAVはこの種のアクセス用に最適化されていません。

あなたがやろうとしていることについてもう少し詳しく(またはMagentoのPHPコードがあなたの目的で機能するかどうか))を教えていただければ、さらにお手伝いできる可能性があります。

お役に立てば幸いです。

ありがとう、ジョー

2
Joseph Mastey
SELECT customer_address_entity_varchar.value, customer_entity.entity_id
FROM customer_address_entity_varchar

LEFT JOIN customer_address_entity 
ON customer_address_entity_varchar.entity_id = customer_address_entity.entity_id

LEFT JOIN customer_entity 
ON customer_address_entity.parent_id = customer_entity.entity_id

WHERE attribute_id =31
1
Manas Sahoo

属性値を取得するための別のサンプルSQLコード。私はintおよびvarchar属性のみを使用しましたが、他の属性を追加することもできます。

select c.entity_id, c.email, 
    a.attribute_id, a.attribute_code, a.frontend_label, a.backend_type, a.frontend_input, 
    case a.backend_type 
        when 'int' then coalesce(o.value, cei.value)
        when 'varchar' then cev.value
    end as value
from customer_entity c
left join eav_attribute a on a.entity_type_id = c.entity_type_id
left join customer_entity_int cei on     a.backend_type = 'int'     and cei.attribute_id = a.attribute_id and cei.entity_id = c.entity_id and cei.entity_type_id = c.entity_type_id
left join customer_entity_varchar cev on a.backend_type = 'varchar' and cev.attribute_id = a.attribute_id and cev.entity_id = c.entity_id and cev.entity_type_id = c.entity_type_id
left join eav_attribute_option_value o on a.backend_type = 'int' and a.frontend_input = 'select' /* and o.store_id = c.store_id */ and o.option_id = cei.value
-- where c.entity_id = 17651
having value is not null
order by c.entity_id, a.attribute_code;
1
Cavit Keskin

これは、サブクエリのない、より単純なクエリになると思います。

SELECT c.email, cv.value as fname, cv2.value as lname
FROM customer_entity c, customer_entity_varchar cv, customer_entity_varchar cv2
WHERE c.entity_id = $user_id
AND c.entity_id = cv.entity_id 
AND cv.attribute_id = 5
AND c.entity_id = cv2.entity_id 
AND cv2.attribute_id = 7
0
Disha Goyal

Andrey Tserkusの素晴らしい答えを変更しました。そして、新しいWHERE句を追加しました。ここで製品のSKUを置き換えるだけで、製品を購入したすべての顧客レコードセットを取得できます。 Magento 1.5.1では問題なく動作します

/* 32行目のi.skuの値を、購入者から入手したい製品の対応するskuで置き換えます*/
 
 SELECT 
 `e`。*、
` at_prefix`.`value` AS `prefix`、
` at_firstname`.`value` AS `firstname`、
` at_middlename`。 `value` AS` middlename`、
 `at_lastname`.`value` AS` lastname`、
 `at_suffix`.`value` AS` suffix`、
 CONCAT(IF (at_prefix.value IS NOT NULL AND at_prefix.value!= ''、
 CONCAT(LTRIM(RTRIM(at_prefix.value))、 '')、
 '')、
 LTRIM(RTRIM(at_firstname.value))、 ''、
 IF(at_middlename.value IS NOT NULL AND at_middlename.value! = ''、
 CONCAT(LTRIM(RTRIM(at_middlename.value))、 '')、
 '')、
 LTRIM(RTRIM(at_lastname.value))、
 IF(at_suffix.value IS NOT NULL AND at_suffix.value!= ''、
 CONCAT( ''、LTRIM(RTRIM(at_suffix.value))) 、
 '')
)AS `name` 
 FROM` customer_entity` AS `e` 
 LEFT JOIN` customer_entity_varchar` AS `at_prefix` ON(` at_prefix`.`entity_id` = `e`.`entity_id`)AND(` at_prefix`.`attribute_id` = '4')
 LEFT JOIN `customer_entity_varchar` AS` at_firstname` ON( `at_firstname`.`entity_id` =` e`。 `entity_id`)AND(` at_firstname`.`attribute_id` = '5')
 LEFT JOIN `customer_entity_varchar` AS` at_middlename` ON( `at_middlename`.`entity_id` =` e`.`entity_id`) AND( `at_middlename`.`attribute_id` = '6')
 LEFT JOIN` customer_entity_varchar` AS `at_lastname` ON(` at_lastname`.`entity_id` = `e`.`entity_id`)AND(` at_lastname `.`attribute_id` = '7')
 LEFT JOIN` customer_entity_varchar` AS `at_suffix` ON(` at_suffix`.`entity_id` = `e`.`entity_id`)AND(` at_suffix`.`attribute_id `= '8')
 WHERE(` e`.`entity_type_id` = '1')
 AND `e`.`entity_id` IN(
 SELECT DISTINCT o.customer_id FROM sales_flat_order_item i 
 INNER JOIN sales_flat_order o ON o.entity_id = i.order_id 
 WHERE o.customer_id IS NOT NULL 
 AND i.sku = '10 -10-10101 -4 '
)
制限1000 
0

以下はMagentoで顧客の詳細を取得できるコードです

if (Mage::getSingleton('customer/session')->isLoggedIn()) {
$customer = Mage::getSingleton('customer/session')->getCustomer();
$customerData = Mage::getModel('customer/customer')->load($customer->getId())->getData();
Mage::log($customerData);}

その出力は以下のような配列になります:-

 Array
(
    [entity_id] => 1
    [entity_type_id] => 1
    [attribute_set_id] => 0
    [website_id] => 1
    [email] => [email protected]
    [group_id] => 1
    [increment_id] => 000000001
    [store_id] => 1
    [created_at] => 2007-08-30 23:23:13
    [updated_at] => 2008-08-08 12:28:24
    [is_active] => 1
    [firstname] => Test
    [lastname] => User
    [password_hash] => 204948a40200e4238db2277d5:eg
    [prefix] => 
    [middlename] => 
    [suffix] => 
    [taxvat] => 
    [default_billing] => 274
    [default_shipping] => 274
)
0
kantsverma