Artikel Übersicht im Backend zeigt keine Artikel mehr an

Hallo zusammen!
Ich betreibe schon lange einen Shopware 5 Shop. Seit einiger Zeit laden keine Artikel mehr im Backend in die Artikel Übersicht.

Es kommt folgender Fehler:
Ups! Ein Fehler ist aufgetreten! Die nachfolgenden Hinweise sollten Ihnen weiterhelfen. Type of association must be one of _TO_ONE or MANY_TO_MANY in /shopware/vendor/doctrine/orm/lib/Doctrine/ORM/Query/SqlWalker.php on line 1097

Ich habe schon sehr viel ausprobiert u.a. den Shop auf die aktuelle Shopware Version aktualisiert und Plugins auch aktualisiert. Zig mal den Cache gelöscht (auch mit rm -rf /var/cache/*) und php bin/console sw:generate:attributes versucht die Attribute neu zu generieren (läuft Fehlerfrei durch)
Habe auch schon versucht Plugins zu deaktivieren aber hat alles nicht wirklich geholfen.
Das einzige was hilft (aber mir nicht ;-)) ist die s_articles_attributes wegzuschmeissen und neu zu erstellen - dann werden die Artikel korrekt angezeigt, können aber natürlich nicht geöffnet werden. Aber ich denke das ist ein Indiz dafür das irgendwas mit den Attributen schief läuft.

Ich habe im SqlWalker auch mal ein paar Debugs eingebaut, das Hauptthema ist das assoc NULL ist, daher kommt dann die Exception…

Vielen Dank und ich hoffe jemand von euch hat eine Idee!?

---- assoc NULL
---- joinAssociationDeclaration: object(Doctrine\ORM\Query\AST\JoinAssociationDeclaration)#2455 (3) { [„joinAssociationPathExpression“]=> object(Doctrine\ORM\Query\AST\JoinAssociationPathExpression)#2454 (2) { [„identificationVariable“]=> string(6) „detail“ [„associationField“]=> string(9) „attribute“ } [„aliasIdentificationVariable“]=> string(4) „attr“ [„indexBy“]=> NULL }
---- joinType: int(3)
---- condExpr: NULL
---- associationPathExpression: object(Doctrine\ORM\Query\AST\JoinAssociationPathExpression)#2454 (2) { [„identificationVariable“]=> string(6) „detail“ [„associationField“]=> string(9) „attribute“ }
---- joinedqlAlias: string(4) „attr“
---- indexBy: NULL
---- relation: array(16) → hier kommt dann zuviel für diesen Editor :wink:

Versuche herauszufinden, ob es unterschiede bei den Freitextfeldern gibt. Sprich was Shopware in der Metadaten Tabelle für die Freitextfelder erwartet:

SELECT * FROM s_attribute_configuration WHERE table_name = 's_articles_attributes';

und welche Felder tatsächlich in der Tabelle s_articles_attributes sind.

SHOW COLUMNS FROM s_articles_attributes;

Wenn es Unterschiede gibt, dann musst du das synchronisieren. Besonders, wenn in der Metadatentabelle Datensätze sind, die nicht in der Tabelle zu finden sind. Anders rum ist es meiner Meinung weniger kritsisch.

Hallo!
Vielen Dank für den Hinweis. Ich habe das mal abgeglichen und in der s_attribute_configuration haben Einträge für attr5 - attr20 gefehlt. Ich habe die mal - analog zu attr1 - angelegt. Leider hat dass das Problem jedoch nicht behoben :frowning:

1.) Hat jedes Feld einen Column_Type? Welche unterschiedlichen hast du? z.B.

boolean
float
html
integer
single_selection
string
text

2.) Bei Feldern mit Column_Type „single_selection“ oder „multi_selection“ werden Datensätze noch aus anderen Tabellen im Shop geholt. Diese wurden durch Plugin’s angelegt. Gibt es da Überbleibsel von deinstallierten Plugins, … ?

SELECT * 
FROM s_attribute_configuration 
WHERE table_name = 's_articles_attributes' 

was hier auffällt ist das es ein nicht konfiguriertes Freitextfeld „articleID“ gibt.

SELECT * FROM s_attribute_configuration WHERE table_name = ‚s_articles_attributes‘ AND column_name=‚articleID‘; => leer

Es gibt folgende Column_Types:

text
string
boolean
integer
datetime
single_selection

Mit single_selection habe ich zwei Felder von zwei Plugins (die noch aktiv sind) und die jeweils Shopware Core Modelle referenzieren: Shopware\Models\Media\Media und Shopware\Models\Country\Country

also der primärschlüssel und die beiden fremdschlüssel sollten da meiner Meinung nicht auftauchen. und wenn, dann sollte da auch ein column_type stehen.:

id, articleID, articledetailsID

Wenn das Model im Backend generiert wird, dann generiert sich eine Datei Article.php in

/var/cache/production_.../doctrine/attributes

Da sollten dann auch Country.php und Media.php sein. Die drei Dateien könntest du dir noch anschauen. Aber nach was du ausschau halten solltest, kann ich dir nicht sagen.

ich habe mal versucht den SQLWalker zu debuggen:

Also dann wenn er in den „default“ vom switch springt weil assoc null ist:

$joinAssociationDeclaration:
object(Doctrine\ORM\Query\AST\JoinAssociationDeclaration)#2456 (3) { [„joinAssociationPathExpression“]=> object(Doctrine\ORM\Query\AST\JoinAssociationPathExpression)#2455 (2) { [„identificationVariable“]=> string(6) „detail“ [„associationField“]=> string(9) „attribute“ } [„aliasIdentificationVariable“]=> string(4) „attr“ [„indexBy“]=> NULL }

$joinedDqlAlias:
string(4) „attr“

$assoc:
NULL

$targetClass->associationMappings[$relation[‚mappedBy‘]]:
NULL

$relation:
array(16) { [„fieldName“]=> string(9) „attribute“ [„targetEntity“]=> string(33) „Shopware\Models\Attribute\Article“ [„joinColumns“]=> array(0) { } [„mappedBy“]=> string(13) „articleDetail“ [„inversedBy“]=> NULL [„cascade“]=> array(1) { [0]=> string(7) „persist“ } [„orphanRemoval“]=> bool(true) [„fetch“]=> int(2) [„type“]=> int(1) [„isOwningSide“]=> bool(false) [„sourceEntity“]=> string(30) „Shopware\Models\Article\Detail“ [„isCascadeRemove“]=> bool(true) [„isCascadePersist“]=> bool(true) [„isCascadeRefresh“]=> bool(false) [„isCascadeMerge“]=> bool(false) [„isCascadeDetach“]=> bool(false) }

Leider ist mir nicht ganz klar, welches Feld das jetzt wo ist?
Die $joinAssociationDeclaration wird da ja reingegeben in die Funktion.
Und da sind diese 3 enthalten:
[„identificationVariable“]=> string(6) „detail“
[„associationField“]=> string(9) „attribute“ }
[„aliasIdentificationVariable“]=> string(4) „attr“

Das sieht nach einem Mapping Problem zwischen Article und Articledetail aus?

Ich habe mir mal die generierte var/cache/production_***/doctrine/attributes/Article.php angeschaut und mit einer aus einer fehlerfreien Shopware 5.7 Installation verglichen. Dabei ist mir aufgefallen:

kaputt
/**
* @var integer $articledetailsID
*
* @ORM\Column(name=„articledetailsID“, type=„integer“, nullable=true)
*/
protected $articledetailsID;

funktioniert
/**
* @var integer $articledetailID
*
* @ORM\Column(name=„articledetailsID“, type=„integer“, nullable=true)
*/
protected $articledetailID;

(Unterschied ist dann auch bei Getter und Setter) - Ich vermute, dass das Problem ist. Ich kann aber bei den Datenbanken (Felder, Keys, usw.) keinen Unterschied feststellen

ich habe den Fehler gefunden:

Der Constraint hat gefehlt:

ALTER TABLE s_articles_attributes ADD CONSTRAINT s_articles_attributes_ibfk_2 FOREIGN KEY (articledetailsID) REFERENCES s_articles_details(id) ON DELETE CASCADE ON UPDATE NO ACTION;

Und zudem war articledetailsID in der s_articles_attributes nicht unsigned (das habe ich jetzt nicht überprüft ob das ein Problem ist, weil das hatte ich schon vor dem Constraint gemacht…

Stellt sich mir immer noch die Frage, warum der Constraint einfach so verschwunden ist, oder ob der erst mit einem minor Shopware Update notwendig wurde (was ich mir eher nicht vorstellen kan)!? Sehr sehr sehr merkwürdig, aber Hauptsache es geht jetzt wieder!

Vielen Dank für die Unterstützung!