• Willkommen im Zend Framework Forum

    ZF1 Zend Framework 1 + ZF2 Zend Framework 2

    Das Zend Framework Forum ist seit 2006 die erste Anlaufstelle für Zend Framework Entwickler in Deutschland. Mit über 70.000 Beiträgen und einer steigenden Nutzerzahl bietet das Forum hilfreiche Themen und ZF-Tutorials für professionelle Entwickler, fortgeschrittene Programmierer sowie Zend Framework Einsteiger.
    Wenn dies Dein erster Besuch in der Zend Framework Community ist, lies bitte zuerst die Hilfe - FAQ durch. Du musst Dich registrieren, bevor Du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um die Registrierung zu starten. Du kannst auch jetzt schon Beiträge lesen. Hier im Forum findest Du die Zend Framework Hilfe, die Du suchst!

    Grüße an alle Zend Framework Entwickler. Das Team vom Zend Framework Forum!

    Drupal Agentur

Doctrine 2 und dynamische Felder

sodiummd

New member
Guten Morgen zusammen,

ich stecke noch nicht ganz so tief in Doctrine drin, versuche mich durch diverse Tutorials zu arbeiten, finde aber zum folgenden Problem nicht die richtige Lösung. Hoffe, dass mir hier jemand helfen kann.

Nehmen wir an, ich habe eine Tabelle für Kunden mit festen Spalten (Systemvorgaben). Nun soll der Benutzer die Möglichkeit bekommen, die Tabelle um eigene Felder zu erweitern, um sie an seine Bedürfnisse anzupassen.
Datenbank-technisch ist das alles kein Problem. Nur wie teile ich Doctrine dann wiederum mit, dass die Tabelle nun mehr Spalten hat, als in der Entity Datei angegeben sind.

- Docblock Annotations: sind dafür zu steif, oder?

Ich dachte an das PHP Mapping, nur ist die Documentation dazu leider recht spartanisch, oder kennt jemand eine ausführlichere Docu bzw. Tutorials dazu?

Bin für alle Anregungen offen! Danke!
 

Kaiuwe

Super-Moderator
Nehmen wir an, ich habe eine Tabelle für Kunden mit festen Spalten (Systemvorgaben). Nun soll der Benutzer die Möglichkeit bekommen, die Tabelle um eigene Felder zu erweitern, um sie an seine Bedürfnisse anzupassen.
Oh, da hast du wohl einen fiesen Fehler im Datenbankdesign! Lege (z.B.) eine weitere Tabelle an, in der die zusätzlichen Daten vom Kunden gespeichert werden können.
 

crash

New member
Du willst das Datenbank-Layout dynamisch ändern!?! Wie wäre es wenn du solche neuen Felder als Zeilen in einer separaten Tabelle anlegst?

// Edit: zu langsam
 

sodiummd

New member
Danke!

Also wie Magento mit dem EAV Prinzip und dann über OneToOne, OneToMany, ManyToOne, etc.?!? bei den To Verbindungen blicke ich auch noch nicht so ganz durch..
 

sodiummd

New member
Ich krieg's nicht hin...
Ich habe nun 2 Tabellen, Kunden & KundenAtribute

Aufbau Kunden
Code:
customer_id, name, etc
Aufbau KundenAtribute
Code:
id, customer_id, attribute_name, attribute_value
Nun hab ich bereits alles versucht, jedes Tutorial von Doctrine durchgerödelt, doch ich kriegs nicht zum laufen. Ich blicke irgendwie bei den ganzen OneToMany, ManyToOne Dingern nicht durch. Habs auch schon mit dem Tut unter dem folgenden Link versucht, auch ohne erfolg.
Composite and Foreign Keys as Primary Key — Doctrine 2 ORM 2.2 documentation

Es soll ja dann der Wert (attribute_value) aus KundenAttribute anhand von attribute_name geholt werden. Aber wie.... Kann mir bitte bitte jemand helfen und das für Dumme erklären :rolleyes:

DANKE!!!
 

Blub?

New member
So dürfte es z.B. gehen (Klassen-, Attributnamen ggfs. ändern)

PHP:
// Kunde.php  
use Doctrine\Common\Collections\ArrayCollection;  

class Kunde 
{    
     /**
      * @ORM\OneToMany(targetEntity="KundenAttribut", mappedBy="kunde")      
      */     
     protected $attribute;      
     
     public function __construct()     
     {         
         $this->attribute = new ArrayCollection();     
     } 
}

// KundenAttribut.php
class KundenAttribut 
{
     /**
      * @ORM\ManyToOne(targetEntity="Kunde", inversedBy="attribute")
      * @ORM\JoinColumn(name="kunde_id", referencedColumnName="id")      
      */     
    protected $kunde; 
}
 
Zuletzt bearbeitet:

sodiummd

New member
Danke Blub, ich würde es nun wie Magento lösen... Nur stehe ich nun wieder vor dem nächsten Problem.

Doctrine will ja für alles ne eigene Entity Datei haben (so wie ich es verstanden habe). Also müsste ich für die folgenden Tabellen jeweils eine Entität anlegen

- KundenEntity
- KundenEntityDatetime
- KundenEntityDecimal
- KundenEntityInt
- KundenEntityText
- KundenEntityVarchar

Kennt ihr vielleicht eine Möglichkeit, dass ganze zu Verallgemeinern, sodass die Entitäten dynamisch gebildet werden können? Die Tabellen sind ja alle gleich aufgebaut, nur muss ja in jeder Datei die Verbindung jeweils für die Joins angeben werden.

Ich dachte da an sowas:
PHP:
$customers = $this->getCollection('customers'); // Hole alle Informationen aus den Tabellen für Kunden (Datetime, Decimal, Int, Text, Varchar)

$products = $this->getCollection('products'); // Hole alle Informationen aus den Tabellen für Artikel (Datetime, Decimal, Int, Text, Varchar)

$clients = $this->getCollection('clients'); // Hole alle Informationen aus den Tabellen für Mandanten (Datetime, Decimal, Int, Text, Varchar)
Jede Anregung gerne gesehen :D

DANKE!!!!!
 

Blub?

New member
Mein Bauchgefühl sagt mir, dass du dich anfängst zu verzetteln. :)

Könntest du uns mal 2-3 Beispiele (natürlich keine Echten) für Kundendaten geben?

Wie soll überhaupt so eine Tabelle KundenEntityDatetime aussehen? ID (int), KundenID (int), Wert (datetime)?
Und das dann für jeden möglichen Datenbankfeldtyp? Halte ich für den falschen Weg.
 

sodiummd

New member
um ehrlich zu sein, glaube ich das auch :)
Code:
CREATE TABLE `accounts_eav_datetime` (  `value_id` int(11) NOT NULL AUTO_INCREMENT,
  `attribute_id` smallint(5) unsigned NOT NULL DEFAULT '0',
  `entity_id` int(11) unsigned NOT NULL DEFAULT '0',
  `value` datetime DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (`value_id`),
  UNIQUE KEY `UNQ_USER_ENTITY_DATETIME_ENTITY_ID_ATTRIBUTE_ID` (`attribute_id`,`entity_id`),
  KEY `IDX_USER_ENTITY_DATETIME_ENTITY_ID_ATTRIBUTE_ID_VALUE` (`entity_id`,`attribute_id`,`value`),
  KEY `IDX_USER_ENTITY_DATETIME_ENTITY_ID_ATTRIBUTE_ID` (`attribute_id`),
  KEY `IDX_USER_ENTITY_DATETIME_ENTITY_ID_ENTITY_ID` (`entity_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
wobei value halt immer den Wert im jeweiligen Format beinhalten sollte. Ehrlich gesagt, fand ich dies auch etwas übertrieben für meine Bedürfnisse. Mir ging es eigentlich nur darum, dass der Benutzer einige Tabellen um ein paar Felder erweitern kann, wenn erforderlich.
 
Oben