Ergebnis 1 bis 6 von 6

Thema: Doctrine Relations und das Contao DCA

  1. #1
    Contao-Fan Avatar von Babelfisch
    Registriert seit
    30.06.2009.
    Ort
    Leipzig
    Beiträge
    939
    Contao-Projekt unterstützen

    Support Contao

    Frage Doctrine Relations und das Contao DCA

    Hallo und einen schönen Pfingstmontag!

    Ich bastle gerade an meiner ersten Conta-Erweiterung mit Symfony und habe eine kurze Frage zu Relations und was der korrekte oder üblichste Weg ist.

    Gegeben sind zwei Tabellen, die über eine ManyToOne Beziehung verbunden sind. Die Beziehung in den Entities sieht vereinfach so aus:

    MyItem.php
    Code:
    #[ORM\Table(name: "tl_my_item")]
    class MyItem
    {
      …
      #[ORM\ManyToOne(targetEntity: MyCollection::class, inversedBy: 'items')]
      private ?MyCollection $collection = null;
    MyCollection.php
    Code:
    #[ORM\Table(name: 'tl_my_collection')]
    class MyCollection
    {
      …
      #[ORM\OneToMany(mappedBy: 'collection', targetEntity: MyItem::class)]
        private Collection $items;
    In der tl_my_item wird dann automatisch die Spalte collection_id angelegt.

    Entsprechend muss ich das Feld in der DCA auch benennen:

    tl_my_item.php
    Code:
    'fields' => [
      …
      'collection_id' => [
        'inputType' => 'select',
        'filter' => true,
        'sorting' => true,
        'foreignKey' => 'tl_my_collection.title',
        'eval' => ['mandatory' => true, 'includeBlankOption' => true, 'tl_class' => 'w50'],
        'relation' => ['type' => 'belongsTo', 'load' => 'lazy'],
      ]
    So richtig gefällt mir das aber nicht, weshalb ich im Entity mit #[ORM\JoinColumn den Spaltennamen explizit angegeben habe:

    MyItem.php
    Code:
    #[ORM\Table(name: "tl_my_item")]
    #[ORM\JoinColumn(name: 'collection', referencedColumnName: 'id')]
    class MyItem
    {
      …
      #[ORM\ManyToOne(targetEntity: MyCollection::class, inversedBy: 'items')]
      private ?MyCollection $collection = null;
    Dann wir die Spalte collection genannte und kann so im DCA angesprochen werden.

    Meine Frage ist jetzt, was hier Best practice ist oder ob es egal ist oder ob ich gleich etwas ganz falsch gemacht habe?

    Gruß
    Meine aktiven Contao-Projekte: LingoliaStiftung firmm

  2. #2
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    38.651
    Partner-ID
    10107

    Standard

    Zuerst unabhängig von deiner Frage: du solltest dir auch überlegen, ob du wirklich DCAs mit Entities betreiben willst. Denn dadurch kann dein DCA nicht mehr um weitere (Datenbank-)Felder erweitert werden. Könnte aber für deinen Use-Case auch egal sein.

    Zu deiner Frage: aus meiner Sicht macht es Sinn den Spaltennamen spezifisch in der Entity-Klasse zu definieren, wenn dieser Spaltenname irgendwo unabhängig von Entities referenziert werden muss (wie bspw. in einem DCA in deinem Fall).
    » sponsor me via GitHub or Revolut

  3. #3
    Contao-Fan Avatar von Babelfisch
    Registriert seit
    30.06.2009.
    Ort
    Leipzig
    Beiträge
    939
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Zuerst unabhängig von deiner Frage: du solltest dir auch überlegen, ob du wirklich DCAs mit Entities betreiben willst.
    Gute Frage, bei der ich schon unsicher bin. Ich arbeite mich gerade durch dieses Tutorial durch, bei dem an dieser Stelle Entities verwendet werden. Ich finde es schon sehr elegant, bin ich nicht sicher, ob es auch der beste Weg ist.

    Zitat Zitat von Spooky Beitrag anzeigen
    Denn dadurch kann dein DCA nicht mehr um weitere (Datenbank-)Felder erweitert werden. Könnte aber für deinen Use-Case auch egal sein.
    Zu Verständnis: Du meinst, dass ich die Tabelle nicht über das DCA erweitern kann? Ich muss dann immer im Entity die Tabelle anpassen und dann das DCA entsprechend ebenfalls anpassen. Damit kann ich dann aber schon noch die Felder erweitern. Richtig?

    Zitat Zitat von Spooky Beitrag anzeigen
    Zu deiner Frage: aus meiner Sicht macht es Sinn den Spaltennamen spezifisch in der Entity-Klasse zu definieren, wenn dieser Spaltenname irgendwo unabhängig von Entities referenziert werden muss (wie bspw. in einem DCA in deinem Fall).
    Danke, so habe ich es dann auch gemacht.

    Noch einmal zu den Entities: die werden in Contao nicht oder kaum verwendet? Ich wollte zumindest gerade eine Relation zu tl_member herstellen, was mangels einer vorhandenen Member-Entity nicht mit #[ORM\ManyToOne funktioniert. Ich kann dann also nur entweder eine simple Verknüftung über ein int-Feld machen, wobei die Doctrine-Magie entfällt oder ich baue mir selbst eine einfache Member-Entity und klammere die über schema_filter für die Migration aus? Da bin ich mir jetzt auch unsicher, ob sich der Aufwand lohnt.
    Meine aktiven Contao-Projekte: LingoliaStiftung firmm

  4. #4
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    38.651
    Partner-ID
    10107

    Standard

    Zitat Zitat von Babelfisch Beitrag anzeigen
    Gute Frage, bei der ich schon unsicher bin. Ich arbeite mich gerade durch dieses Tutorial durch, bei dem an dieser Stelle Entities verwendet werden. Ich finde es schon sehr elegant, bin ich nicht sicher, ob es auch der beste Weg ist.
    Ich habe mir den Artikel noch nicht durchgelesen, wäre bei dieser Webseite aber vorsichtig. Könnte alles LLM generiert sein.



    Zitat Zitat von Babelfisch Beitrag anzeigen
    Zu Verständnis: Du meinst, dass ich die Tabelle nicht über das DCA erweitern kann? Ich muss dann immer im Entity die Tabelle anpassen und dann das DCA entsprechend ebenfalls anpassen. Damit kann ich dann aber schon noch die Felder erweitern. Richtig?
    Es geht darum, ob du möchtest, dass andere das DCA erweitern können sollen. So wie es in Contao ja ganz normal ist (wenn du bspw. ein neues Feld zu tl_news oder tl_content hinzufügst).



    Zitat Zitat von Babelfisch Beitrag anzeigen
    Noch einmal zu den Entities: die werden in Contao nicht oder kaum verwendet?
    Doch, Contao verwendet Entities. Aber nicht für DCAs.



    Zitat Zitat von Babelfisch Beitrag anzeigen
    Ich wollte zumindest gerade eine Relation zu tl_member herstellen, was mangels einer vorhandenen Member-Entity nicht mit #[ORM\ManyToOne funktioniert. Ich kann dann also nur entweder eine simple Verknüftung über ein int-Feld machen, wobei die Doctrine-Magie entfällt oder ich baue mir selbst eine einfache Member-Entity und klammere die über schema_filter für die Migration aus? Da bin ich mir jetzt auch unsicher, ob sich der Aufwand lohnt.
    Vielleicht sind auch die DcaRelations von Haste eine Alternative für dich.
    Geändert von Spooky (Heute um 12:39 Uhr)
    » sponsor me via GitHub or Revolut

  5. #5
    Contao-Fan Avatar von Babelfisch
    Registriert seit
    30.06.2009.
    Ort
    Leipzig
    Beiträge
    939
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Es geht darum, ob du möchtest, dass andere das DCA erweitern können sollen. So wie es in Contao ja ganz normal ist (wenn du bspw. ein neues Feld zu tl_news oder tl_content hinzufügst).
    Ach so, das meinst du. Das wäre in diesem konkreten Fall egal, da es eine private Erweiterung wird. Ist aber gut im Hinterkopf zu behalten, wenn ich mal eine Erweiterung veröffentlichen will.

    Zitat Zitat von Spooky Beitrag anzeigen
    Vielleicht sind auch die DcaRelations von Haste eine Alternative für dich.
    Danke, das schaue ich mir einmal an.
    Meine aktiven Contao-Projekte: LingoliaStiftung firmm

  6. #6
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    38.651
    Partner-ID
    10107

    Standard

    Zitat Zitat von Babelfisch Beitrag anzeigen
    Ach so, das meinst du. Das wäre in diesem konkreten Fall egal, da es eine private Erweiterung wird. Ist aber gut im Hinterkopf zu behalten, wenn ich mal eine Erweiterung veröffentlichen will.
    Ja, für reine interne Sachen könnten Entities dann wegen der Relations, automatischer serialization und deserialization von bspw. DateTime Feldern, etc. ganz praktisch sein. Andererseits muss man dann Entity und DCA immer synchron halten, könnte den Mehraufwand aber Wert sein.
    » sponsor me via GitHub or Revolut

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 3 (Registrierte Benutzer: 0, Gäste: 3)

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •