Rohes SQL im Plugin / Controller

Hi,
ich habe hier folgendes Beispiel, leider gibt es kein Ergebnis zurück, wahrscheinlich weil DBAL nicht reines SQL zulässt?

use Doctrine\DBAL\Connection;  
...
class XXXController extends StorefrontController
   {
      private Connection $connection;
      …
      public function __construct(Connection $connection) { 
          $this->connection = $connection;
      }
      ...
      public function (...) {
      $sql = "SELECT * FROM example AS pes WHERE pes.order_id IN ($placeholders)";

      $pickwareStock = $this->connection->fetchAllAssociative($sql, $orderIds);
     }
   }

Für ein Beispiel mit rohem SQL wäre ich sehr dankbar.

Danke und Gruss

Ich glaube dieses Beispiel könnte dir helfen: shopware/src/Core/Content/Product/Stock/StockStorage.php at trunk · shopware/shopware · GitHub

Viele Grüße

Vielen Dank für das Beispiel, jedoch funktioniert das nicht.
Irgendwie werden die Hex Werte beim umwandeln in Uuid nicht korrekt ausgeführt.
Gibt es da eine möglichkeit echtes rohes SQL zu machen anstatt dieses Verkrüppelung?

Danke und Gruss.

Hm?! Wieso Verkrüppelung? Shopware arbeitet mit UUIDs und für direkte SQL Abfragen müssen diese in die entsprechenden binaries übersetzt werden. Das IST „rohes“ SQL.

Viele Grüße

Ich glaube, sein Punkt bezieht sich auf Uuid::fromHexToBytes($context->getVersionId())

hex2bin($uuid) steckt hinter der Methode. Alternativ in SQL direkt per use HEX() „to input and UNHEX() to output“.

$orderIdsBin = Uuid::fromHexToBytesList($orderIds); // $orderIds ist ["019...","019...",...]

 $pickwareStock = $this->connection->fetchAllAssociative(
    "SELECT * FROM pickware_erp_stock AS pes WHERE pes.order_id IN (:orderIdsBin)",
    ['orderIdsBin' => $orderIdsBin],
    ['orderIdsBin' => ArrayParameterType::BINARY]
 );

Mit Verkrüppelung meine ich, dass es viele Hinweise Im Netz gibt wie es gehen müsste. mit/ohne prepare(), mit/ohne SQL,SQL als variable, mit/ohne executeQuery() Jetzt habe ich alles ausprobiert und nur executeStatement() gibt mir eine 1…

Danke und Gruss.

Das sieht mir doch soweit richtig aus? Gibts irgendwelche Fehlermeldungen - oder wo ist nun konkret das Problem?

Viele Grüße

Hi,
leider gibt es keinen Fehler.
Rückgabewert bei gettype() ist Array. count(Array) = 1, aber es ist „nichts“.
Direkt in phpmyadmin die SQL und ich erhalte ein Ergebnis.
Direkt die komplette fertige SQL reingemacht und ich bekomme nichts. > $sql = "SELECT * FROM pickware_erp_stock AS pes WHERE pes.order_id IN (UNHEX('0192d8e1941f737eb99bc43c1564870e'),UNHEX('0192d.... usw

  • executeQuery()
  • fetchAssociative()
  • fetchAllKeyValue()
  • fetchAllAssociativeIndexed()

Die Syntax ist korrekt, sonst würde MySQL einen Fehler werfen. Die Parameter sind korrekt, sonst würde doctrine einen Fehler werfen. Es werden also schlichtweg keine Datensätze gefunden.

Was ergibt ein dd($pickwareStock)? Was ergibt ein dd($pickwareStock) wenn du den WHERE Teil weglässt.

Viele Grüße

dd($pickwareStock) bekomme ich folgendes ergebnis. das ist ja schonmal was, danke für die info.

 array:1 [▼
  b"<Aâ‗̸L´øøV6ü¦å▒" => array:15 [▼
    "quantity" => "1"
    "product_id" => b"
\x01
’|';épߦÊtßS cf"
    "product_version_id" => b"
\x0F
©
\x1C
ãéjK¾KÙÎu,4%"
    "location_type_technical_name" => "order"
    "warehouse_id" => null
    "bin_location_id" => null
    "order_id" => b"
\x01
’Øá”
\x1F
s~¹›Ä<
\x15
d‡
\x0E
"
    "order_version_id" => b"
\x0F
©
\x1C
ãéjK¾KÙÎu,4%"
    "stock_container_id" => null
    "goods_receipt_id" => null
    "return_order_id" => null
    "return_order_version_id" => b"
\x0F
©
\x1C
ãéjK¾KÙÎu,4%"
    "special_stock_location_technical_name" => null
    "created_at" => "2025-01-23 12:26:54.753"
    "updated_at" => null
  ]
]

ist denn dann an meiner ausgabe im trig was falsch?

return $this->renderStorefront('@MyTheme/storefront/page/account/backlog.html.twig', [
            "pickwareStock" => $pickwareStock
        ]);

wo das hier steht:

let pickwareStock = {{ pickwareStock | json_encode | raw }};

Danke und Gruss

Mensch @brettvormkopp, du bist doch nun lange genug dabei. Hör doch bitte auf uns immer wieder nur stückchenweise anzufüttern und uns immer die Hälfe zu verschweigen :frowning:

Welche twig Ausgabe meinst du? Was genau „ist falsch“? Wo und in welchem Zusammenhang steht dein „let pickwareStock…“?

Was du aber auf jeden Fall tun solltest, wenn du mit den Daten weiterarbeiten möchtest: am besten die binarys values direkt in der SQL Abfrage in hex zu rechnen:

SELECT LOWER(HEX(id)) AS id, location_type_technical_name, LOWER(HEX(order_id)) AS order_id …

Viele Grüße

1 „Gefällt mir“

Hi, ja du hast recht. Sorry.

Danke für die Lösung.

Wie schafft es den phpmyadmin mit einer custom Query die binary in hex zu wandeln als ergebnis, wenn ich dort die gleiche Query eingebe? Wie wandeln die das um zu einem lesbaren ergebnis?

Danke und Gruss.

Wie oben bereits geschrieben kannst du LOWER(HEX(id)) nutzen, um die binary in einen (lesbaren) hex umzuwandeln.

Viele Grüße

Dieses Thema wurde automatisch 30 Tage nach der letzten Antwort geschlossen. Es sind keine neuen Antworten mehr erlaubt.