Получение информации о клиентах из структуры таблицы magento
Я хочу получить строки для всех деталей клиента из пурпурных таблиц.
Может ли кто-нибудь дать мне запрос?
Таблицы:
- customer_entity
- eav_attribute
- customer_entity_varchar
Ответы
Ответ 1
Можно извлечь некоторые данные из Magento MySQL DB, но перед выполнением запросов ниже:
1) Magento создан для конфигурирования, поэтому вы не должны извлекать данные из MySQL, но для получения данных клиента вы должны использовать модуль клиента Magento (модели, модели ресурсов) и данные конфигурации Magento. Любой прямой запрос не гарантированно совместим с различными версиями Magento и даже с установками той же версии.
2) Структура Magento EAV не позволяет вам получать все данные клиента в хорошей форме в рамках одного запроса, поскольку имена таблиц динамически сопоставляются с атрибутами.
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'
Ответ 2
Это небольшой запрос для извлечения деталей клиента из пурпурных таблиц:
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
Ответ 3
Чтобы дополнить ответ @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
Ответ 4
Вы ищете фактический SQL для этого или некоторого кода Magento? Фактический SQL будет запутанным и, вероятно, никогда не будет выглядеть так, как вы хотите.
Поскольку в MySQL нет "поворота", вы можете в принципе игнорировать 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
;
Продолжайте добавлять эти предложения join для каждого атрибута, и у вас будет ваш запрос. В принципе, EAV не оптимизирован для такого доступа.
Если вы дадите немного больше информации о том, что вы пытаетесь сделать (или будет ли PHP-код в Magento работать в ваших целях), мы можем помочь вам в дальнейшем.
Надеюсь, что это поможет!
Спасибо,
Джо
Ответ 5
Я прочитал, что выше, и я чувствую себя намного лучше, зная, что некоторые люди там пытаются выяснить, что проблема моя.
Ну, как вы знаете, вы не можете найти всю информацию о своих клиентах в бэк-офисе magento.
Я хотел иметь очень большую таблицу, где я могу видеть всех моих клиентов (тех, у кого есть учетная запись = зарегистрирована) (и тех, кто только что зарегистрировался в новостных письмах newsletter_subscribers)
Так как я действительно не знаю, как magento предоставляет эту информацию, я написал код som SQL для извлечения данных.
Как сказано выше, вы не можете иметь всю информацию о клиентах в одном запросе. На самом деле вам понадобятся столько запросов, сколько атрибуты клиентов.
Если клиент объекта имеет 45 атрибутов (имя, фамилия, имя_пользователя, адрес электронной почты.....)
то вам понадобится 45 запросов для их извлечения...
Мой вопрос был КАК???
Ответ: ПРОСМОТРЫ!!
Фактически, я написал "Виды" для извлечения каждой информации об атрибутах. Это означает, что я написал 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 очень важен, потому что это позволит вам найти ваши атрибуты по идентификаторам таблиц:
entity_customer_vachar, entity_customer_int, entity_customer_text, entity_customer_datetime
Возможно, вы узнаете первое имя attribute_id = 5 в этой таблице, как писал в своем запросе Джозеф Масти...
Информация отправляется по типу в приведенных выше таблицах.
Когда вы запустите запрос выше, вы увидите, что каждый атрибут имеет бэкэндпип. это означает, что информация, которую вы ищете, является одной из таблиц, суффиксных по типу.
Например, если вы ищете имя, тип которого является 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 Core, это было бы здорово!
Благодаря
Ответ 6
Я специально пытался экспортировать номера мобильных телефонов клиентов из своего магазина 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.
Надеюсь, это поможет кому-то...
Ответ 7
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
Ответ 8
Я изменил великий ответ Андрея Церкуса. И добавил новое предложение WHERE. Теперь вам просто нужно заменить SKU продукта, и вы получите все наборы записей клиентов, которые купили продукт. Прекрасно работает для меня в Magento 1.5.1
/* Just replace the value for i.sku in line 32, with the corresponding sku of the product you want to get the buyers from*/
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'
)
LIMIT 1000
Ответ 9
Я считаю, что это может быть более простой запрос без подзапросов:
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
Ответ 10
Ниже приведен код, который вы можете получить в деталях клиента в 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
)
Ответ 11
Другой пример кода 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;