ich muss aus der Datenbank c.a. 30 Tausend Artikeln löschen, die alle nichts im Feld “Gewicht” haben. Wenn ich das in Artikeln/Übersicht/Filter mit einem entsprechenden Filter machen würden, dann bräuchte ich c.a. 400 Seiten durchgehen. Das möchte ich lieber vermeiden und suche nun einen besseren Weg
Leider hilft mir was dort steht kaum. Ich brauche nicht alle, sondern einige Artikeln zu löschen, obwohl von diesen “einigen” die Hälfte der Datenbank entsteht.
bei sovielen Artikeln würde ich das direkt in der Datenbank machen. Eventuell hilft dir ja der folgende Ansatz.
Setz dir einfach einen Testshop auf, importier dort Testdaten und exportier dir dann ein SQL Dump. Danach löschst du einfach einen Artikel im Backend und erstellst dir dann einen neuen Dump und vergleichst die beiden Dumps z.B. mit Winmerge und schaust dir die Änderungen an. Daraus kannst du dir dann einen Löschbefehl zusamannen bauen.
Schau dir auf jedenfall noch die Beziehungen unter PHPMyAdmin an. Einige Daten sind auch miteinander verknüpft, so dass dein Löschbefehl nicht in jeder Tabelle tätig werden muss.
Auch wenn ich das persönlich so noch nicht durchgeführt habe, wäre das mein Ansatz. Eventuell würde ich hier auch ein kleines PHP Script schreiben, dass diesen Prozess durchführt.
die Idea von @enerSpace ist sehr gut, aber ich bevorzuge etwas andere zu benutzen.
Das Shopware Api ist mein Freund und ich glaube es helft dir beim Ihre Problem.
Wenn du das Api benutzen , dann vergessst du über was du darfst löchen und von welche Tablen und ob dass macht deine Shop nicht mir funktionert, weil die Löchen würde beim Shopware core angerufen.
also wie darfst du diese mache wie folgend :
1- schreibe ein sql zu nehmen die ArtikelsIDs , die ohne Gewicht sind.
2- ruf diese sql beim ein PHP Code an , und spar die IDs in einem Array.
3- vielleicht brauchst du ‚array_chunk‘ funktion, um das (30 Tausend) Array in kleiner Arrays zu teilen , um du hast keine Timeout Problem mit Api request.
Danke für die Idee, @ahmadsaad. Ich habe sie etwa fortgeschritten, um manuel nichts mit SQL zu haben und REST API Classes zu verwenden:
$ArticleResource = Manager::getResource('article');
// Set up filter criteria
$filter = array(
'mainDetail' => array(
'weight' => null,
),
);
// Get all articles fitting the filter
$result = $ArticleResource->getList(null, 50000, $filter);
$articles = $result[0];
// Delete the articles
foreach($articles as $article){
try{
$ArticleResource->delete($article->getId());
} catch (\Exception $e) {
//handle the exception
}
}
Ich habe das als Cronjob konfiguriert, aber etwas ist da falsch:
src_native git:(master) ✗ php bin/console sw:cron:run Shopware_CronJob_ClearEET -f
Processing Null-gewicht-Artikle löschen
An exception occurred while executing 'SELECT count(DISTINCT s0_.id) AS sclr_0 FROM s_articles s0_ LEFT JOIN s_articles_details s1_ ON s0_.main_detail_id = s1_.id LEFT JOIN s_articles_attributes s2_ ON s1_.id = s2_.articledetailsID WHERE s0_.main_detail_id IN (?)' with params [null]:
SQLSTATE[HY093]: Invalid parameter number: parameter was not defined
Please use the action name of a cronjob. You can see existing cronjobs in shopware backend or via sw:cron:list command.
Hat jemand eine Idee woran das liegen könnte? Danke!
Das Problem ist anscheinend in $filter: wenn ich keine Parameters übergeben, dann läuft das Skript und wenn ich den wert für ‚weight‘ als „“ statt null einsetze, becomme ich eine leicht geänderte Fehlermeldung:
➜ src_native git:(master) ✗ php bin/console sw:cron:run Shopware_CronJob_ClearEET -f
Processing Null-gewicht-Artikle löschen
An exception occurred while executing 'SELECT count(DISTINCT s0_.id) AS sclr_0 FROM s_articles s0_ LEFT JOIN s_articles_details s1_ ON s0_.main_detail_id = s1_.id LEFT JOIN s_articles_attributes s2_ ON s1_.id = s2_.articledetailsID WHERE s0_.main_detail_id IN (?)' with params [""]:
SQLSTATE[HY093]: Invalid parameter number: parameter was not defined
Please use the action name of a cronjob. You can see existing cronjobs in shopware backend or via sw:cron:list command.
Jetzt funktioniert es (es bedurfte noch einer kleinen Änderung: von $article->getId() zu zu $article[‘id’] sowie $article[‘data’] statt $article[0]. Jetzt alles noch mal zusammen:
use \Shopware\Components\Api\Manager;
$ArticleResource = Manager::getResource('article');
// Set up filter criteria
$filter = array(
array(
'property' => 'mainDetail.weight',
'expression' => '=',
'value' => null,
),
);
// Get all articles fitting the filter
for($i = 0; $i < 50000; $i+1000){
$result = $ArticleResource->getList($i, 1000, $filter);
$articles = $result['data'];
// Delete the articles
foreach($articles as $article){
try{
$ArticleResource->delete($article['id']);
} catch (\Exception $e) {
//handle the exception
}
}
}
UPDATE: Um Speicherauslauf zu vermeiden, soll man die erste 2 Parameters von $ArticleResource->getList() mit einer Schleife verwenden. Den Code habe ich aktualisiert.