Hallo ich versuche grad einen Magentoshop der Version 1.8.1.0 mithilfe des Migrations-Plugins von Shopware in einen Shopware Shop der Version 5.3.2 zu Migrieren. Das Mapping der Felder hat soweit gut geklappt. Ich erhalte aber kurz nach dem Start folgende fehlermeldung:
Code : 42000
Line : 224
File : /var/www/vhosts/lvps83-169-4-7.dedicated.hosteurope.de/httpdocs/engine/Library/Zend/Db/Statement/Pdo.php
Error : SQLSTATE[42000]: Syntax error or access violation: 1066 Not unique table/alias: ‘meta_keyword’
Egal was ich migrieren will (Artikel oder nur Kunden) es kommt immer wieder dieser Fehler.
Über hinweise würde ich mich freuen!
Danke
Klingt als würde eine Tabelle/Field als Alias “meta_keyword” definiert werden, während im selben Statement bereits eine solch lautende Tabelle/Field verwendet wird…
Oder es wird für eine Tabelle ein Alias vergeben, welcher dem akuten Tabellenname 1:1 entspricht, das mag SQL teils auch nicht.
Bekommst du das Statement heraus?
1 „Gefällt mir“
Hallo erstmal danke für die Antwort:
ich bin mir nicht sicher ob das weiter hilft, aber villeicht hat es hiermit etwas zu tun (aus der magento.php des Migrations Plugins):
public function getProductSelect() { $attributes = ['description', 'name', 'short\_description', 'status', 'manufacturer', 'price', 'cost', 'tax\_class\_id', 'meta\_keyword', 'special\_price']; $custom\_select = ''; foreach ($this-\>getAttributes() as $attributeID =\> $attribute) { $custom\_select .= ", $attributeID.value as `$attributeID`"; $attributes[] = $attributeID; } $sql = " SELECT catalog\_product.entity\_id as productID, catalog\_product.sku as ordernumber, catalog\_product.created\_at as added, name.value as name, NULL as additionaltext, description.value as description\_long, short\_description.value as description, meta\_keyword.value as keywords, manufacturer\_option.value as supplier, cs.qty as instock, cs.min\_qty as stockmin, cs.min\_sale\_qty as minpurchase, cs.max\_sale\_qty as maxpurchase, tax\_class\_id.value as taxID, cost.value as baseprice, IFNULL(special\_price.value, price.value) as price, IF(special\_price.value IS NULL, 0, price.value) as pseudoprice $custom\_select FROM {$this-\>quoteTable('catalog\_product\_entity')} catalog\_product -- Joins the attribute tables {$this-\>createTableSelect('catalog\_product', $attributes, 0)} -- Join for instock LEFT JOIN {$this-\>quoteTable('cataloginventory\_stock\_item')} cs ON cs.`product_id`=catalog\_product.`entity_id` AND cs.`stock_id`=1 -- maps child articles to parents LEFT JOIN {$this-\>quoteTable('catalog\_product\_relation')} relation ON catalog\_product.entity\_id=relation.child\_id -- Joins the attribute values for the manufacturer LEFT JOIN {$this-\>quoteTable('eav\_attribute\_option\_value')} manufacturer\_option ON manufacturer\_option.option\_id=manufacturer.value -- Need to order by parent id in order to correctly assign children later ORDER BY relation.parent\_id ASC "; return $sql; }
Woah… okay, der Teil hier KÖNNTE das Problem sein:
FROM {$this->quoteTable('catalog_product_entity')} catalog_product
-- Joins the attribute tables
{$this->createTableSelect('catalog_product', $attributes, 0)}
Kann nicht mit Bestimmtheit sagen, was er bei “$this->createTableSelect” macht, allerdings wird hier “catalog_product” übergeben, welches bereits als Alias für catalog_product_entity verwendet wurde…
Ansonsten vielleicht mal über dem “return $sql;” ein "die(’
'.$sql.'
');" einbauen um zu schauen, wie das fertige Statement aussieht
1 „Gefällt mir“
Okay danke! leider verstehe ich noch nicht ganz aber hier nochmal die funktion createTableSelect:
/\*\* \* Returns the sql statement to select the shop system article attribute fields \* \* @param string $type \* @param null $attributes \* @param null $store\_id \* @param bool $full\_select \* @return string \*/ public function createTableSelect( $type = 'catalog\_product', $attributes = null, $store\_id = null, $full\_select = false ) { $sql = " SELECT ea.attribute\_code as `name`, ea.attribute\_id as `id`, ea.backend\_type as `type`, ea.is\_required as `required` FROM {$this-\>quoteTable('eav\_attribute')} ea, {$this-\>quoteTable('eav\_entity\_type')} et WHERE ea.`entity_type_id`=et.entity\_type\_id AND et.entity\_type\_code=? AND ea.frontend\_input!='' "; if (!empty($attributes)) { $sql .= 'AND ea.attribute\_code IN (' . $this-\>Db()-\>quote($attributes) . ')'; } else { $sql .= 'ORDER BY `required` DESC, `name`'; } $attribute\_fields = $this-\>Db()-\>fetchAssoc($sql, [$type]); if (empty($attributes)) { $attributes = array\_keys($attribute\_fields); } $select\_fields = []; $join\_fields = ''; // Do not use quoteTable for aliases! $type\_quoted = "`{$type}`"; foreach ($attributes as $attribute) { if (empty($attribute\_fields[$attribute])) { $join\_fields .= " LEFT JOIN (SELECT 1 as attribute\_id, NULL as value) as `$attribute` ON 1 "; } else { if ($attribute\_fields[$attribute]['type'] == 'static') { $select\_fields[] = "{$type\_quoted}.{$attribute}"; } else { $join\_fields .= " LEFT JOIN {$this-\>quoteTable($type.'\_entity\_'.$attribute\_fields[$attribute]['type'])} `$attribute` ON `{$attribute}`.attribute\_id = {$attribute\_fields[$attribute]['id']} AND `{$attribute}`.entity\_id = {$type\_quoted}.entity\_id "; if ($store\_id !== null) { $join\_fields .= " AND {$attribute\_fields[$attribute]['name']}.store\_id = {$this-\>Db()-\>quote($store\_id)} "; } $select\_fields[] = "{$attribute}.value as `{$attribute}`"; } } } if (!$full\_select) { return $join\_fields; } else { $select\_fields = implode(', ', $select\_fields); return " SELECT $select\_fields FROM {$this-\>quoteTable($type.'\_entity')} $type $join\_fields "; } } }
@PStadtfeld schrieb:
Ansonsten vielleicht mal über dem „return $sql;“ ein "die(’
‚.$sql.‘
');" einbauen um zu schauen, wie das fertige Statement aussieht
Danke für den Tip. Meinst du ausgeben lassen? Wie würde das aussehen? hab leider nicht soviel Ahnung davon…
Setz mal über das „return $sql“ folgende Zeile:
die(''.$sql.'');
Und ruf das nochmal auf, im besten Fall solltest du dann eine Ähnliche Ausgabe im Browserfenster bekommen mit dem gesamten Statement ohne Platzhalter, Variablen und Funktionen.
1 „Gefällt mir“
@PStadtfeld schrieb:
Setz mal über das „return $sql“ folgende Zeile:
die(‚‘.$sql.‚‘);
Und ruf das nochmal auf, im besten Fall solltest du dann eine Ähnliche Ausgabe im Browserfenster bekommen mit dem gesamten Statement ohne Platzhalter, Variablen und Funktionen.
Danke habe ich so gemacht. Leider bleibt der Vorgang stehen ohne das eine Ausgabe kommt. (Das Fenster des tools bleibt da nur der Import Ladebalken bleibt stehen… )
Blöd… Shopware hat Log-Befehle, mit denen KÖNNTE man versuchen das Statement in eine Log-Datei zu schreiben, aber da müsste ich nun selbst suchen… wie der PluginLogger nochmal richtig angesprochen wird …
Irgendwas wie:
Shopware()-\>PluginLogger()-\>error($sql);
Da es sich hier aber scheinbar um ein Shopware-Eigenes Plugin handelt, müsstest du dich doch einfach an den Support direkt wenden können, oder? Das wäre vielleicht die einfachste Lösung, die haben das ja auch gebaut. Gehe davon aus, dass vielleicht eine deiner alten Tabellen so heisst wie eine Shopware-Tabelle oder so, aber alles bloss Vermutung an dieser Stelle…
1 „Gefällt mir“
Ok danke ich werde nochmal schauen wie das Logging funktioniert und ggf. das Ergebnis hier Posten.
Den Support werde ich auch nochmal anschreiben.
Vielen Dank für die Hilfe!
Shopware()->PluginLogger()->error($sql);
Ich habe nochmal nachgeschaut. Der befehl ist so richtig und schreibt das Statement in die Log Datei.
Hilft der Support weiter? Ansonsten kannst du mir die Log-Datei auch mal per PM schicken, dann seh ich mir das Statement an…
Die Frage ist dann nur, ob ich auf Anhieb das Problem auch finden würde und wie wir das im Plugin ordentlich beheben.
1 „Gefällt mir“
Also generell bieten wir keinen Support für das Plugin an, siehe den Hinweis im Store: http://store.shopware.com/swag00426/migration-von-anderen-shopsystemen-zu-shopware.html
Natürlich kann die Community hier unterstützen. Wenn du möchtest, kann ich auch einmal reinschauen, wenn du mir die Datenbank schickst würde ich das mal eben durchtesten. Hier einfach eine Mail an forum@shopware.com schicken. Wenn es eine Kleinigkeit ist, sollte man das recht schnell finden. Versprechen, dass man es so gelöst bekommt, kann ich allerdings nicht.
1 „Gefällt mir“
@PStadtfeld schrieb:
Hilft der Support weiter? Ansonsten kannst du mir die Log-Datei auch mal per PM schicken, dann seh ich mir das Statement an…
Die Frage ist dann nur, ob ich auf Anhieb das Problem auch finden würde und wie wir das im Plugin ordentlich beheben.
Danke, habe das sql statement an dich gesendet.
@Moritz Naczenski schrieb:
Also generell bieten wir keinen Support für das Plugin an, siehe den Hinweis im Store: http://store.shopware.com/swag00426/migration-von-anderen-shopsystemen-zu-shopware.html
Natürlich kann die Community hier unterstützen. Wenn du möchtest, kann ich auch einmal reinschauen, wenn du mir die Datenbank schickst würde ich das mal eben durchtesten. Hier einfach eine Mail an forum@shopware.com schicken. Wenn es eine Kleinigkeit ist, sollte man das recht schnell finden. Versprechen, dass man es so gelöst bekommt, kann ich allerdings nicht.
Danke! Habe grade an die Emailadresse gesendet.
Haben den Fehler nun hoffentlich gefunden, eine Tabelle scheint doppelt gejoint worden zu sein, nämlich „meta_keyword“, dass er dann meckert ist klar 
1 „Gefällt mir“
Danke damit bin ich der Lösung schon einen entscheidenen Schritt näher. D.h in der Funktion createTableSelect() (oben schoneinmal gepostet) des Migrations Plugins (magento.php) müsste ein Fehler sein?!
Habt ihr eine Idee warum diese Funktion einen fehlerhaften SELECT zurück gibt?