web-dev-qa-db-fra.com

obtenir des informations sur les clients à partir de la structure de table magento

Je souhaite obtenir des lignes pour tous les détails du client à partir de tables magento.

Quelqu'un peut-il me donner la requête?

Les tableaux sont: 

  • client_entité
  • eav_attribute
  • customer_entity_varchar
15
user319198

Il est possible d'extraire certaines données de Magento MySQL DB, mais avant d'exécuter une requête, notez que: 

1) Magento est conçu pour être configurable, de sorte que vous ne devez pas extraire les données de MySQL, mais vous devez utiliser le module client Magento (modèles, modèles de ressources) et les données de configuration Magento pour extraire les données client. Aucune requête directe n'est compatible avec différentes versions de Magento et même avec des installations de la même version.

2) La structure EAV de Magento ne vous permet pas de récupérer toutes les données client dans un formulaire Nice dans une requête, car les noms de table sont associés à des attributs de manière dynamique.

3) Vous ne pouvez pas extraire TOUTES les données client à l'aide d'une seule requête ou même de plusieurs requêtes. Parce que de nombreux objets d’information sont créés dans des modèles et que seul celui-ci dispose de la logique pour rassembler toutes les données d’un objet client. Je parle d’adresses d’expédition/de facturation, de crédit en magasin, de points de fidélité (pour la version EE), etc.

Cependant, juste pour récupérer les attributs varchar de tous les clients, vous pouvez utiliser le code suivant (le fonctionnement ne sera pas garanti du fait que mentionné ci-dessus dans 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

Il est également possible d'utiliser une telle requête pour extraire tous les attributs d'un client.

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

Pour compléter la réponse de @ Stefano, j’ai posé une grande question, pour extraire d’autres détails importants, tels que l’adresse et le téléphone. Certains de ces détails n'auront de sens que dans ma base de données, mais peuvent aider quelqu'un:

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

Voici une petite requête pour extraire les détails du client des tables de 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

J'ai lu ce qui précède et je me sens beaucoup mieux en sachant que certaines personnes essaient de comprendre le problème comme étant le mien… Eh bien, comme vous le savez peut-être, vous ne pouvez pas trouver toutes les informations sur vos clients dans magento Bureau. Je voulais avoir une très grande table où je peux voir tous mes clients (ceux qui ont un compte = enregistrés) (et ceux qui viennent de s’inscrire à des lettres de nouvelles newsletter_abonnés)

Comme je ne sais pas vraiment comment magento fournit ces informations, j'ai écrit som code SQL pour extraire des données.

Comme il est dit ci-dessus, vous ne pouvez pas avoir toutes les informations sur les clients dans une requête. En fait, vous aurez besoin d'autant de requêtes que d'attributs clients. Attributs . Si l'entité client a 45 attributs (nom, nom, prénom, nom moyen, email, ...) .__, il vous faudra 45 requêtes pour les extraire. .. Ma question était comment ???

La réponse est VIEW !! En fait, j’ai écrit Views pour extraire chaque information d’attribut. Cela signifie que j'ai écrit 45 vues, chaque vue sélectionne un attribut

Je ne sais pas comment cela se fait dans votre base de données, mais vous savez peut-être que chaque entité a un entity_type_id . Dans mon cas, je m'intéresse à customer_entity et à customer_address_entity . entity_type_id = 1 le customer_address_entity a un entity_type_id = 2

Chaque entité a des attributs. Donc, si vous voulez voir quels sont les attributs disponibles pour l'entité client, exécutez la requête:

Select attribute_code, attribute_id, backend_type from eav_attribute where entity_type_id =1 Même chose pour l'entité adresse en remplaçant le 1 par 2.

La colonne attributs_id est très importante car elle vous permettra de trouver vos attributs en fonction des tables: Mastey a écrit dans sa requête ...

Les informations sont réparties par type dans les tableaux ci-dessus . Lorsque vous exécutez la requête ci-dessus, vous verrez que chaque attribut a un type de backend. cela signifie que les informations que vous recherchez sont l’une des tables suffixées par son type ..__ Par exemple, si vous recherchez un prénom dont le type est varchar, vous le trouverez dans customer_entity_varchar et ainsi de suite.

Si vous lisez encore, cela signifie peut-être que vous comprenez de quoi je parle . Sinon, vous devez examiner le modèle EAV Et le schéma de base de données magento 1.3.2.4 à l'adresse http: //inchoo.net/wp-content/uploads/2010/09/MAGENTO_v1.3.2.4-Database_Diagram.pdf

Je ne peux pas publier la solution dans son ensemble car elle n'est pas encore prête. Je vais mettre un fichier Zip si cela peut vous aider.

En attendant, si quelqu'un sait comment utiliser des objets magento avec un fichier php pour obtenir les données sans modifier le noyau de Magento, ce serait génial! Merci.

3
Mehdi

J'essayais spécifiquement d'exporter les numéros de téléphone mobile des clients de ma boutique Magento.

Pour ce faire, vous pouvez d’abord utiliser les profils de données, car ils s’étendent au fichier client.

Dans mon cas, la fonction de profils de données ne fonctionnait pas pour une raison quelconque et comme je n’avais pas le temps de comprendre pourquoi je me suis directement adressée à MySQL pour obtenir mes données.

La requête MySQL suivante vous permettra d’extraire les clients possédant un numéro de téléphone mobile britannique. Remarque: vous devrez peut-être déterminer quel attribut_id correspond aux données dont vous avez besoin et mettre à jour la requête en conséquence.

attribute_id value
26 Country
19 First_Name
21 Surname
31 Telephone

QUESTION:-

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;

Notez la limite et la déclaration where limitant le résultat à des données spécifiques. Le groupe arrête les numéros en double, car les données réelles que je souhaite sont le numéro de téléphone. Vous pouvez ajouter INTO OUTFILE pour exporter le jeu de résultats au format CSV.

J'espère que ça aide quelqu'un ...

2
Flipmedia

Êtes-vous à la recherche de SQL pour ceci ou pour du code Magento? Le code SQL actuel va devenir compliqué et ne ressemblera probablement pas à ce que vous souhaitez.

Comme il n’existe pas de "pivot" dans MySQL, vous pouvez en principe ignorer eav_attribute dans la requête. Vous le consulterez pour trouver les identifiants d'attribut souhaités. Voici un exemple trivial sur la manière de sélectionner ces données:

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
;

Continuez à ajouter ces clauses de jointure pour chaque attribut, et vous aurez votre requête. Fondamentalement, EAV n'est pas optimisé pour ce type d'accès.

Si vous donnez un peu plus de détails sur ce que vous essayez de faire (ou si le code PHP de Magento fonctionnera pour vos besoins), nous pourrons peut-être vous aider davantage.

J'espère que cela pourra aider!

Merci, Joe

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

Je crois que cela pourrait être une requête plus simple sans sous-requêtes: 

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

J'ai modifié l'excellente réponse d'Andrey Tserkus. Et ajouté une nouvelle clause WHERE. Maintenant, vous avez juste besoin de remplacer le SKU du produit et vous obtiendrez tous les jeux de clients, qui ont acheté le produit. Fonctionne bien pour moi dans Magento 1.5.1

/* Il suffit de remplacer la valeur de i.sku dans la ligne 32 par le sku correspondant du produit que vous voulez obtenir des acheteurs à partir de */

 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 (SI (at_prefix.value IS NON NULL ET at_prefix.value! = '', 
 CONCAT (LTRIM (RTRIM (._Attache)), ''), 
 '., __. LTRIM (RTRIM (at_firstname.value)), '', 
 IF (at_middlename.value IS NOT NULL ET at_middlename.value! = ', 
 CONCAT (LTRIM (RTRIM (RTRIM (.RTRIM. valeur)), ''), 
 ''), 
 LTRIM (RTRIM (at_lastname.value)), 
 IF (at_suffix.value IS NON NULL ET at_suffix.value! = ' ', 
 CONCAT (' ', LTRIM (RTRIM (at_suffix.value))), 
' ') 
) AS' name` 
 FROM 'customer_entity` AS' e` 
 LEFT REJOIGNEZ `customer_entity_varchar` AS AS` at_prefix` ON (`at_prefix`.``entity_id` =` e`.`entity_id`) AND (`at_prefix`.``attribute_id` = '4') 
 LEFT REJOIGNEZ `customer_entity_varchar` AS 'at_firstname` ON (` at_firstname`.`entity_id` = `e`.`entity_id`) ET (ʻat_firstname`.`attribute_id` =' 5 ') 
 LEFT JOIN 'client_entity_varchar` AS AS at_middlename` ON (`at_middlename`.``entity_id` =` e`.`entity_id`) ET (ʻat_middlename`.``attribute_id` =' 6 ') 
 LEFT REJOIGNEZ `customer_entity_varchar` AS 'at_lastname` ON (` at_lastname`.``entity_id` = `e`.`entity_id`) ET (` at_lastname`.`attribute_id` =' 7 ') 
 LEFT JOIN 'customer_entity_varchar` AS AS' at_suffix` ON (`at_suffix`.``entity_id` =` e`.`entity_id`) ET (`at_suffix`.``attribute_id` = '8') 
 WHERE (` e`. ʻentity_type_id` = '1') 
 ET '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 PAS NULL 
 ET i.sku = '10 -10-10101-4 '
) 
 LIMITE 1000 
0

Ci-dessous le code que vous pouvez extraire le détail du client dans 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);}

Sa sortie sera dans tableau comme ci-dessous: -

 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

Un autre exemple de code SQL permettant d’obtenir des valeurs d’attributs. J'ai utilisé uniquement les attributs int et varchar, vous pouvez également en ajouter d'autres. 

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