it-roy-ru.com

получение информации о клиенте из структуры таблицы magento

Я хочу получить строки для всех данных клиента из таблиц magento.

Кто-нибудь может дать мне запрос?

Таблицы являются: 

  • customer_entity
  • eav_attribute
  • customer_entity_varchar
15
user319198

Можно извлечь некоторые данные из базы данных Magento MySQL, но перед выполнением запросов ниже обратите внимание на следующее: 

1) Magento построен с возможностью настройки, поэтому вам не нужно извлекать данные из MySQL, но вы должны использовать модуль клиента Magento (модели, модели ресурсов) и данные конфигурации Magento для извлечения данных клиента. Любой прямой запрос не гарантирует совместимость с различными версиями Magento и даже с установками одной и той же версии.

2) Структура Magento EAV не позволяет извлекать все данные клиентов в форме Nice в пределах одного запроса, поскольку имена таблиц сопоставляются с атрибутами динамически.

3) Вы не можете извлечь ВСЕ данные о клиенте только одним запросом или даже несколькими запросами. Поскольку многие информационные объекты создаются внутри моделей, и только модель имеет логику для сбора всех данных в одном объекте заказчика. Я говорю об адресах доставки/выставления счетов, кредитах магазина, бонусных баллах (для версии 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
Pablo S G Pacheco

Это небольшой запрос для извлечения сведений о клиенте из таблиц 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
6
Stefano Gaviglia

Я прочитал, что выше, и чувствую себя намного лучше, зная, что некоторые люди пытаются выяснить проблему как мою…. Ну, как вы знаете, вы не можете найти всю информацию о ваших клиентах в magento back- офис. Я хотел, чтобы у меня была очень большая таблица, где я мог бы видеть всех своих клиентов (тех, кто имеет аккаунт = зарегистрирован) (и тех, кто только что зарегистрировался в новостных письмах newsletter_subscribeers)

Поскольку я действительно не знаю, как magento предоставляет эту информацию, я написал некоторый SQL-код для извлечения данных.

Как сказано выше, вы не можете иметь всю информацию о клиентах в одном запросе. На самом деле, вам понадобится столько же запросов, сколько и атрибутов клиентов Если клиент сущности имеет 45 атрибутов (имя, фамилия, имя_пользователя, адрес электронной почты .....) Тогда вам потребуется 45 запросов для их извлечения. .. Мой вопрос был, КАК ???

Ответ: VIEWS !! На самом деле я написал 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.

Столбец attribute_id очень важен, потому что это позволит вам найти ваши атрибуты по идентификаторам таблиц: Entity_customer_vachar, entity_customer_int, entity_customer_text, entity_customer_datetime Возможно, вы найдете firstname attribute_id = 5 в этой таблице как Джозеф Масти написал в своем запросе ...

Информация отправляется по типу в приведенных выше таблицах . Когда вы выполните запрос выше, вы увидите, что у каждого атрибута есть тип backend. это означает, что информация, которую вы ищете, является одной из таблиц с суффиксом ее типа ... Например, если вы ищете имя, типа varchar, вы найдете его в 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, это было бы здорово! Спасибо

3
Mehdi

Я специально пытался экспортировать номера мобильных телефонов клиентов из моего магазина Magento.

Во-первых, вы можете сделать это с помощью профилей данных, поскольку они распространяются на набор данных клиентов.

В моем случае функция профилей данных по какой-то причине не работала, и так как у меня не было времени разобраться, почему я обратился непосредственно к MySQL, чтобы получить свои данные.

Следующий запрос MySQL позволит вам извлекать клиентов с номерами мобильных телефонов в Великобритании. Примечание: вам может потребоваться определить, какой атрибут_ид данных вам нужен, и соответствующим образом обновить запрос.

attribute_id value
26 Country
19 First_Name
21 Surname
31 Telephone

QUERY: -

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

Вы ищете реальный SQL для этого или некоторого кода Magento? Реальный SQL станет грязным и, вероятно, никогда не будет выглядеть так, как вы этого хотите.

Поскольку в MySQL нет «pivot», вы можете игнорировать eav_attribute в реальном запросе. Вы будете смотреть на него, чтобы найти требуемые идентификаторы атрибутов. Вот тривиальный пример того, как выбрать эти данные:

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 не оптимизирован для такого доступа.

Если вы дадите немного больше информации о том, что вы пытаетесь сделать (или будет ли PHP код в Magento работать для ваших целей), мы сможем помочь вам в дальнейшем.

Надеюсь, это поможет!

Спасибо, Джо

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

Я считаю, что это может быть более простой запрос без подзапросов: 

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

Я изменил отличный ответ Андрея Церкуса. И добавил новое предложение WHERE. Теперь вам просто нужно заменить SKU продукта, и вы получите все наборы записей клиентов, которые купили продукт . У меня отлично работает в Magento 1.5.1

/* Просто замените значение i.sku в строке 32 на соответствующий артикул продукта, который вы хотите получить от покупателей */

 SELECT 
 `É`. * 
 `at_prefix``value` AS` prefix`, 
 `at_firstname``value` AS` firstname`, 
 `at_middlename``value` AS` middlename`, 
 `at_lastname``value` AS` фамилия`, 
 `at_suffix``value` AS` суффикс`, 
 CONCAT (IF (at_prefix.value IS NOT NULL И 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. значение)), ''), 
 ''), 
 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` 
 СЛЕДУЮЩЕЕ СОЕДИНЕНИЕ `customer_entity_varchar` AS` at_prefix` ON (`at_prefix`` .entity_id` = `e``. Entity_id`) AND (` at_prefix` `.attribute_id` = '4') 
 СЛЕДУЮЩЕЕ СОЕДИНЕНИЕ `customer_entity_varchar` AS` at_firstname` ON (`at_firstname`` .entity_id` = `e``. Entity_id`) AND (` at_firstname` .attribute_id` = '5') 
 СЛЕДУЮЩЕЕ СОЕДИНЕНИЕ `customer_entity_varchar` AS` at_middlename` ON (`at_middlename``. Entity_id` =` e``.entity_id`) AND (`at_middlename`. Attribute_id` = '6') 
 СЛЕДУЮЩЕЕ СОЕДИНЕНИЕ `customer_entity_varchar` AS` at_lastname` ON (`at_lastname`` .entity_id` = `e`` .entity_id`) AND (`at_lastname` .attribute_id` = '7') 
 СЛЕДУЮЩЕЕ СОЕДИНЕНИЕ `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') 
 И` e`.entity_id` IN (
 SELECT DISTINCT o.customer_id FROM sales_flat_order_item i 
 ВНУТРЕННЕЕ СОЕДИНЕНИЕ sales_flat_order o ON o.entity_id = i.order_id 
 ГДЕ o.customer_id IS НЕ НУЛЬ. 
 И i.sku = '10 -10-10101-4 '
) 
 LIMIT 1000 
0
Sebastian Buckpesch

Ниже приведен код, который вы можете получить детали клиента в 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

Другой пример кода 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;
0
Cavit Keskin