porno porno izle rokettube
Seite 1 von 2 1 2 LetzteLetzte
Ergebnis 1 bis 20 von 22

Thema: Select - Join - Hydrator - ohne Funktion?

  1. #1
    Erfahrener Benutzer
    Registriert seit
    05.09.2008
    Beiträge
    308
    Thanks
    0
    Thanked 3 Times in 1 Post

    Standard Select - Join - Hydrator - ohne Funktion?

    Ich nehme das Buch als Richtlinie und baue dann mein Projekt auf.

    Leider schaffe ich es jetzt nicht, bei einem Select (Tabelle admin_berechtigung) mit Join (Tabelle admin_berechtigung_ziel), dass die verknüpfte Tabelle die Werte zurück gibt. Wer setzt den Wert in die Entity von admin_berechtigung? Bei einer Ausgabe habe ich keinen Aufruf festgestellt.

    PermissionTargetEntityStrategy (1 zu 1 von deinem Buch)

    Hydrator (Parent)
    PHP-Code:
    class PermissionHydrator extends ClassMethods
        
    {
            public function 
    __construct()
            {
                
    parent::__construct();

                
    $this->addStrategy('last_modified', new DateTimeFormatterStrategy('Y-m-d H:i:s'));

                
    $this->addStrategy('admin_berechtigung_ziel', new PermissionTargetEntityStrategy(new PermissionTargetHydrator()));
            }
        } 
    Storage
    PHP-Code:
    ...
            public function 
    getListExtended()
            {
                
    $oSql $this->_oTableGateway->getSql()->select();
                
    $oSql->order('berechtigung_id ASC');
                
    $oSql->join('admin_berechtigung_ziel',
                            
    'admin_berechtigung_ziel.berechtigung_id = admin_berechtigung.berechtigung_id',
                            [
    'admin_berechtigung_ziel_ziel' => 'ziel']);

                
    $oResultSet $this->_oTableGateway->selectWith($oSql);

                return 
    $oResultSet->current();
            }
    ... 
    Controller
    PHP-Code:
    ...
    public function 
    indexAction()
            {
                
    $oData $this->_oRepository->getListExtended();

                
    var_dump($oData);
                
    var_dump($oData->getAdminBerechtigungZiel());

                
    $oViewModel = new ViewModel();

                return 
    $oViewModel;
            }
    ... 
    Output (var_dump($oData)
    Code:
    object(AdminPermission\Model\Entity\PermissionEntity)[590]   private 'berechtigung_id' => string '1' (length=1)
      private 'bezeichnung' => string 'Login' (length=5)
      private 'position' => string '1' (length=1)
      private 'last_modified' => 
        object(DateTime)[591]
          public 'date' => string '2015-05-25 03:45:51.000000' (length=26)
          public 'timezone_type' => int 3
          public 'timezone' => string 'Europe/Berlin' (length=13)
      private 'admin_berechtigung_ziel' => null
    Output (var_dump($oData->getAdminBerechtigungZiel())
    Code:
    null
    Die Hydratoren sind in der Config registriert.

    Woran könnte es noch liegen?

  2. #2
    Erfahrener Benutzer Avatar von Ralf
    Registriert seit
    14.12.2006
    Beiträge
    436
    Thanks
    0
    Thanked 46 Times in 36 Posts

    Standard

    Hallo rainman1983,

    in deinem Storage steht im SQL "admin_berechtigung_ziel_ziel", aber in deinem steht "admin_berechtigung_ziel". Das könnte der Fehler sein.

    Gruß,

    Ralf

  3. #3
    Erfahrener Benutzer
    Registriert seit
    05.09.2008
    Beiträge
    308
    Thanks
    0
    Thanked 3 Times in 1 Post

    Standard

    Hallo Ralf,

    wenn ich den erzeugten SQL anschaue, dann sieht der sehr gut aus. Ich denke nicht, dass dies am Storage liegt. Weil wenn ich das ResultSet als Array zurückgebe, dann erhalte ich auch alle Treffer, halt immer ohne Daten vom Ziel.

    Ich bin langsam ratlos.

    Schönen Sonntag
    Ben

  4. #4
    Super-Moderator Avatar von Kaiuwe
    Registriert seit
    30.12.2006
    Beiträge
    5.447
    Thanks
    3
    Thanked 346 Times in 277 Posts

    Standard

    Zitat Zitat von rainman1983 Beitrag anzeigen
    wenn ich den erzeugten SQL anschaue, dann sieht der sehr gut aus.
    Ich kann Ralf hier nur zustimmen, denn das was du hier veröffentlichst hast, enthält einen Fehler.

    Siehe in deiner Storage-Klasse:

    Zitat Zitat von rainman1983
    PHP-Code:
    $oSql->join(
        
    'admin_berechtigung_ziel',
        
    'admin_berechtigung_ziel.berechtigung_id = admin_berechtigung.berechtigung_id',
        [
    'admin_berechtigung_ziel_ziel' => 'ziel']
    ); 
    "admin_berechtigung_ziel_ziel" muss doch "admin_berechtigung_ziel.ziel" sein.
    Zum Zend Framework stehen jedem folgende Quellen zum Nachschlagen zur Verfügung:

  5. #5
    Erfahrener Benutzer
    Registriert seit
    05.09.2008
    Beiträge
    308
    Thanks
    0
    Thanked 3 Times in 1 Post

    Standard

    Ich habe es den Unterstrich durch den Punkt ersetzt. Leider bleibt das Ergebnis gleich.

    Wenn du das Buch von Ralf zur Hand hast, dann schau dir mal das Beispiel auf Seite 459 an. Hier wird beim Join, die Key-Felder aber mit Unterstrich verbunden und nicht mit dem Punkt.

    An dieser Stelle werden nur die Namen der Felder der Join-Tabelle eindeutig festgelegt. So dass ich diese zwischen der Elterntabelle unterscheiden kann.

  6. #6
    Super-Moderator Avatar von Kaiuwe
    Registriert seit
    30.12.2006
    Beiträge
    5.447
    Thanks
    3
    Thanked 346 Times in 277 Posts

    Standard

    Zitat Zitat von rainman1983 Beitrag anzeigen
    Ich habe es den Unterstrich durch den Punkt ersetzt. Leider bleibt das Ergebnis gleich.
    Macht auch keinen Sinn! Ich hatte mich bei der Angabe von Datenbankfeldname und Alias verlesen. Die Angabe stimmt dort.

    Zitat Zitat von rainman1983
    wenn ich den erzeugten SQL anschaue, dann sieht der sehr gut aus.
    Dann setze mal weiter vorne an: Überprüfe das erzeugte SQL mit deinem Datenbankverwaltungsprogramm deines Vertrauens. Solltest du dort alle Ergebnisse korrekt erhalten, wird der Fehler beim Hydrator und den zugehörigen Strategien liegen.

    Du kannst auch mal die Klassen "PermissionTargetHydrator" und "PermissionTargetEntityStrategy" hier veröffentlichen.
    Zum Zend Framework stehen jedem folgende Quellen zum Nachschlagen zur Verfügung:

  7. #7
    Super-Moderator Avatar von Kaiuwe
    Registriert seit
    30.12.2006
    Beiträge
    5.447
    Thanks
    3
    Thanked 346 Times in 277 Posts

    Standard

    Zitat Zitat von rainman1983 Beitrag anzeigen
    Ich habe es den Unterstrich durch den Punkt ersetzt. Leider bleibt das Ergebnis gleich.
    Macht auch keinen Sinn! Ich hatte mich bei der Angabe von Datenbankfeldname und Alias verlesen. Die Angabe stimmt bei dir.

    Zitat Zitat von rainman1983
    wenn ich den erzeugten SQL anschaue, dann sieht der sehr gut aus.
    Dann setze mal weiter vorne an: Überprüfe das erzeugte SQL mit einem Datenbankverwaltungsprogramm deines Vertrauens. Solltest du dort alle Ergebnisse korrekt erhalten, wird der Fehler beim Hydrator und den zugehörigen Strategien liegen.

    Du kannst auch mal die Klassen "PermissionTargetHydrator" und "PermissionTargetEntityStrategy" hier veröffentlichen.
    Geändert von Kaiuwe (05.02.2017 um 13:08 Uhr)
    Zum Zend Framework stehen jedem folgende Quellen zum Nachschlagen zur Verfügung:

  8. #8
    Erfahrener Benutzer
    Registriert seit
    05.09.2008
    Beiträge
    308
    Thanks
    0
    Thanked 3 Times in 1 Post

    Standard

    Der SQL-String sieht gut aus. Ich erhalte auch von PHPMyAdmin alle gewünschten Daten.

    Ich habe den SQL angepasst. Habe admin_berechtigung_ziel durch target ersetzt.

    PHP-Code:
    public function getListExtended()
            {
                
    /* @var $oSql \Zend\Db\Sql\Select */

                
    $oSql $this->_oTableGateway->getSql()->select();
                
    $oSql->order('admin_berechtigung.berechtigung_id ASC');
                
    $oSql->join('admin_berechtigung_ziel',
                            
    'admin_berechtigung_ziel.berechtigung_id = admin_berechtigung.berechtigung_id',
                            [
    'target_berechtigung_ziel_id'    => 'berechtigung_ziel_id',
                             
    'target_berechtigung_id'         => 'berechtigung_id',
                             
    'target_ziel'                        => 'ziel',
                             
    'target_last_modified'         => 'last_modified']);

                
    $oResultSet $this->_oTableGateway->selectWith($oSql);

                return 
    $oResultSet->current();
            } 
    PermissionTargetHydrator
    PHP-Code:
    class PermissionTargetHydrator extends ClassMethods
        
    {
            public function 
    __construct()
            {
                
    parent::__construct();

                
    $this->addStrategy('last_modified', new DateTimeFormatterStrategy('Y-m-d H:i:s'));
            }
        } 

    PermissionTargetEntityStrategy
    PHP-Code:
    class PermissionTargetEntityStrategy implements StrategyInterface
        
    {
            private 
    $_oHydrator;

            public function 
    __construct(HydratorInterface $oHydrator)
            {
                
    $this->_oHydrator $oHydrator;
            }

            public function 
    extract($oValue)
            {
                if (
    $oValue instanceof PermissionTargetEntity)
                {
                    return 
    $oValue->getBerechtigungZielId();
                }

                return 
    $oValue;
            }

            public function 
    hydrate($sValue$aData = [])
            {
                
    $aTargetData = [];

                foreach (
    $aData as $sKey => $sValue)
                {
                    if (
    substr($sKey08) != 'target_')
                    {
                        continue;
                    }

                    
    $aTargetData[substr($sKey8)] = $sValue;
                }

                
    $oEntity = new PermissionTargetEntity();
                
    $this->_oHydrator->hydrate($aTargetData$oEntity);

                return 
    $oEntity;
            }
        } 

  9. #9
    Erfahrener Benutzer Avatar von Ralf
    Registriert seit
    14.12.2006
    Beiträge
    436
    Thanks
    0
    Thanked 46 Times in 36 Posts

    Standard

    Der Name des Feldes, dem du eine Strategy zuordnest muss genauso lauten, wie der Name der Spalte, wenn die Daten aus der Datenbank kommen. Wenn du nun also den Namen "target_ziel" in deinem Select als Alias verwendest, musst du auch in deinem PermissionHydrator die PermissionTargetEntityStrategy dem Namen "target_ziel" zuweisen. Im Ausgangsposting hattest du im Select als Alias "admin_berechtigung_ziel_ziel" verwendet und im Hydrator "admin_berechtigung_ziel". Das passt nicht.

    Gruß,

    Ralf

  10. #10
    Erfahrener Benutzer
    Registriert seit
    05.09.2008
    Beiträge
    308
    Thanks
    0
    Thanked 3 Times in 1 Post

    Standard

    Das ist klar Ralf.

    Ich habe im PermissionHydrator dies wie folgt angepasst:
    PHP-Code:
    class PermissionHydrator extends ClassMethods
        
    {
            public function 
    __construct()
            {
                
    parent::__construct();

                
    $this->addStrategy('last_modified', new DateTimeFormatterStrategy('Y-m-d H:i:s'));

                
    $this->addStrategy('target', new PermissionTargetEntityStrategy(new PermissionTargetHydrator()));
            }
        } 
    Warum sollte dies jetzt hier target_ziel lauten?

    In der Methode hole ich doch den Wert, wie folgt:
    PHP-Code:
    public function getListExtended()
            {
                
    /* @var $oSql \Zend\Db\Sql\Select */

                
    $oSql $this->_oTableGateway->getSql()->select();
                
    $oSql->order('admin_berechtigung.berechtigung_id ASC');
                
    $oSql->join('admin_berechtigung_ziel',
                            
    'admin_berechtigung_ziel.berechtigung_id = admin_berechtigung.berechtigung_id',
                            [
    'target_berechtigung_ziel_id'    => 'berechtigung_ziel_id',
                             
    'target_berechtigung_id'         => 'berechtigung_id',
                             
    'target_ziel'                        => 'ziel',
                             
    'target_last_modified'         => 'last_modified']);

                
    $oResultSet $this->_oTableGateway->selectWith($oSql);

                return 
    $oResultSet->current();
            } 
    Wie muss ich hier denn das Mapping zwischen DB-Feld und Key der Verknüpften Tabelle machen? Der Schlüssel "target_" müsste dann doch der Schlüssel im Hydrator (ohne Unterstrich) sein?

    In der PermissionEntity habe ich dann folgendes
    PHP-Code:
    class PermissionEntity implements DefaultEntityInterface
        
    {
            private 
    $berechtigung_id;
            private 
    $bezeichnung;
            private 
    $position;
            private 
    $last_modified;
            private 
    $target;

            public function 
    setBerechtigungId($mValue) { $this->berechtigung_id $mValue; }
            public function 
    getBerechtigungId() { return $this->berechtigung_id; }

            public function 
    setBezeichnung($mValue) { $this->bezeichnung $mValue; }
            public function 
    getBezeichnung() { return $this->bezeichnung; }

            public function 
    setPosition($mValue) { $this->position $mValue; }
            public function 
    getPosition() { return $this->position; }

            public function 
    setLastModified(\DateTime $mValue) { $this->last_modified $mValue; }
            public function 
    getLastModified() { return $this->last_modified; }

            public function 
    setTarget(PermissionTargetEntity $oEntity) { $this->target $oEntity; }
            public function 
    getTarget() { return $this->target; }

            public function 
    updateDateTimeFields()
            {
                
    $this->setLastModified(new \DateTime());
            }
        } 
    Damit sollte das doch funktionieren?

  11. #11
    Erfahrener Benutzer
    Registriert seit
    05.09.2008
    Beiträge
    308
    Thanks
    0
    Thanked 3 Times in 1 Post

    Standard

    Wenn ich mir von der Methode "getListExtended()", den Wert $oResultSet ausgeben lasse, erhalte ich folgendes:
    PHP-Code:
    object(Zend\Db\ResultSet\HydratingResultSet)[577]
      protected 
    'hydrator' => 
        
    object(AdminPermission\Model\Hydrator\PermissionHydrator)[219]
          private 
    'hydrationMethodsCache' (Zend\Hydrator\ClassMethods) => 
            array (
    size=6)
              
    'AdminPermission\Model\Entity\PermissionEntity::$berechtigung_id' => string 'setBerechtigungId' (length=17)
              
    'AdminPermission\Model\Entity\PermissionEntity::$bezeichnung' => string 'setBezeichnung' (length=14)
              
    'AdminPermission\Model\Entity\PermissionEntity::$position' => string 'setPosition' (length=11)
              
    'AdminPermission\Model\Entity\PermissionEntity::$last_modified' => string 'setLastModified' (length=15)
              
    'AdminPermission\Model\Entity\PermissionEntity::$berechtigung_ziel_id' => boolean false
              
    'AdminPermission\Model\Entity\PermissionEntity::$ziel' => boolean false
          
    private 'extractionMethodsCache' (Zend\Hydrator\ClassMethods) => 
            array (
    size=0)
              empty
          protected 
    'underscoreSeparatedKeys' => boolean true
          
    private 'callableMethodFilter' (Zend\Hydrator\ClassMethods) => 
            
    object(Zend\Hydrator\Filter\OptionalParametersFilter)[225]
          protected 
    'strategies' => 
            
    object(ArrayObject)[220]
              private 
    'storage' => 
                array (
    size=2)
                  ...
          protected 
    'namingStrategy' => 
            
    object(Zend\Hydrator\NamingStrategy\UnderscoreNamingStrategy)[224]
          protected 
    'filterComposite' => 
            
    object(Zend\Hydrator\Filter\FilterComposite)[221]
              protected 
    'orFilter' => 
                
    object(ArrayObject)[222]
                  ...
              protected 
    'andFilter' => 
                
    object(ArrayObject)[223]
                  ...
      protected 
    'objectPrototype' => 
        
    object(AdminPermission\Model\Entity\PermissionEntity)[244]
          private 
    'berechtigung_id' => null
          
    private 'bezeichnung' => null
          
    private 'position' => null
          
    private 'last_modified' => null
          
    private 'target' => null
      
    protected 'buffer' => null
      
    protected 'count' => null
      
    protected 'dataSource' => 
        
    object(Zend\Db\Adapter\Driver\Pdo\Result)[579]
          protected 
    'statementMode' => string 'forward' (length=7)
          protected 
    'fetchMode' => int 2
          
    protected 'resource' => 
            
    object(PDOStatement)[578]
              public 
    'queryString' => string 'SELECT `admin_berechtigung`.*, `admin_berechtigung_ziel`.`berechtigung_ziel_id` AS `target_berechtigung_ziel_id`, `admin_berechtigung_ziel`.`berechtigung_id` AS `target_berechtigung_id`, `admin_berechtigung_ziel`.`ziel` AS `target_ziel`, `admin_berechtigung_ziel`.`last_modified` AS `target_last_modified` FROM `admin_berechtigung` INNER JOIN `admin_berechtigung_ziel` ON `admin_berechtigung_ziel`.`berechtigung_id` = `admin_berechtigung`.`berechtigung_id` ORDER BY `admin_berechtigung`.`berechtigung_id` ASC' (length=508)
          protected 
    'options' => null
          
    protected 'currentComplete' => boolean false
          
    protected 'currentData' => null
          
    protected 'position' => int -1
          
    protected 'generatedValue' => string '0' (length=1)
          protected 
    'rowCount' => null
      
    protected 'fieldCount' => int 8
      
    protected 'position' => int 0 
    Die fett markierten Zeilen stammen aus der Kind-Tabelle (admin_berechtigung_ziel). Warum werden hier nicht alle angezeigt? Die zwei restlichen Felder sind natürlich in der Parent-Tabelle (last_modified und berechtigung_id) auch schon vorhanden.

  12. #12
    Erfahrener Benutzer
    Registriert seit
    05.09.2008
    Beiträge
    308
    Thanks
    0
    Thanked 3 Times in 1 Post

    Standard

    Ich habe das Beispiel vom TestController auf Seite 452 probiert. Hier funktioniert es auch schon bei mir nicht.

    PHP-Code:
    $aData = [
                    
    'berechtigung_id' => 1,
                    
    'bezeichnung' => 'Test',
                    
    'position' => 9,
                    
    'last_modified' => date('Y-m-d H:i:s'),
                    
    'target_berechtigung_ziel_id' => 1,
                    
    'target_berechtigung_id' => 1,
                    
    'target_ziel' => 'asdfasdfasdf',
                    
    'target_last_modified' => date('Y-m-d H:i:s'),
                ];

                
    $oEntity = new PermissionEntity();

                
    $oHydrator = new PermissionHydrator();
                
    $oHydrator->hydrate($aData$oEntity);

                
    var_dump($oEntity);
                
    var_dump($oHydrator->extract($oEntity)); 
    Sehr komisch das Ganze!

  13. #13
    Erfahrener Benutzer Avatar von Ralf
    Registriert seit
    14.12.2006
    Beiträge
    436
    Thanks
    0
    Thanked 46 Times in 36 Posts

    Standard

    Also nochmal von Vorne. Ich verweise mal auf die Beispiele aus dem Buch. Hier wird die CompanyEntityStrategy im AdvertHydrator dem Feld "company" zugewiesen.

    https://github.com/zf3buch/zendframe...drator.php#L40

    Die CompanyEntityStrategy erwartet, dass alle Felder die relevant sind, mit einem "company_" Präfix beginnen:

    https://github.com/zf3buch/zendframe...rategy.php#L63

    Im AdvertDbStorage werden diese Felder gejoint, wobei jedes Feld den "company_" Präfix voran gestellt bekommt:

    https://github.com/zf3buch/zendframe...orage.php#L210

    Wichtig ist dabei, dass das Feld "company" (siehe oben) auch im SELECT enthalten ist. Das ist der Aufhänger, damit die Hydrator Strategy ausgeführt werden kann.

    Kannst du also bitte nochmal deinen PermissionHydrator, deine PermissionTargetEntityStrategy und die Storage-Klasse komplett hier posten. Dann können wir das einmal abgleichen.

    Ich bin für vier Tage auf einer ZF3 Schulung und deshalb etwas eingeschränkt erreichbar. Also nicht wundern, wenn es etwas dauert.

    Gruß,

    Ralf

  14. #14
    Erfahrener Benutzer
    Registriert seit
    05.09.2008
    Beiträge
    308
    Thanks
    0
    Thanked 3 Times in 1 Post

    Standard

    Zitat Zitat von Ralf Beitrag anzeigen
    Wichtig ist dabei, dass das Feld "company" (siehe oben) auch im SELECT enthalten ist. Das ist der Aufhänger, damit die Hydrator Strategy ausgeführt werden kann.
    Wie meinst du diesen Satz?

    PermissionHydrator
    PHP-Code:
    class PermissionHydrator extends ClassMethods implements HydratorInterface
        
    {
            public function 
    __construct()
            {
                
    parent::__construct();

                
    $this->addStrategy('last_modified', new DateTimeFormatterStrategy('Y-m-d H:i:s'));

                
    $this->addStrategy('target', new PermissionTargetEntityStrategy(new PermissionTargetHydrator()));
            }
        } 
    PermissionTargetEntityStrategy
    PHP-Code:
    class PermissionTargetEntityStrategy implements StrategyInterface
        
    {
            private 
    $_oHydrator;

            public function 
    __construct(HydratorInterface $oHydrator)
            {
                
    $this->_oHydrator $oHydrator;
            }

            public function 
    extract($oValue)
            {
                if (
    $oValue instanceof PermissionTargetEntity)
                {
                    return 
    $oValue->getBerechtigungZielId();
                }

                return 
    $oValue;
            }

            public function 
    hydrate($sValue$aData = [])
            {
                
    $aTargetData = [];

                foreach (
    $aData as $sKey => $sValue)
                {
                    
    $sSearch       'target_';
                    
    $iLengthSearch strlen($sSearch);

                    if (
    substr($sKey0$iLengthSearch) != $sSearch)
                    {
                        continue;
                    }

                    
    $aTargetData[substr($sKey$iLengthSearch)] = $sValue;
                }

                
    $oEntity = new PermissionTargetEntity();
                
    $this->_oHydrator->hydrate($aTargetData$oEntity);

                return 
    $oEntity;
            }
        } 
    Storage
    PHP-Code:
    class PermissionDbStorage implements PermissionStorageInterface
        
    {
            protected 
    $_oTableGateway;
            protected 
    $_oHydrator;


            public function 
    __construct(TableGatewayInterface $oTableGateway)
            {
                
    $this->_oTableGateway $oTableGateway;
                
    $oResultSetPrototype  $this->_oTableGateway->getResultSetPrototype();

                
    $oHydrator            $oResultSetPrototype->getHydrator();
                
    $this->_oHydrator     $oHydrator;
            }

            public function 
    getListExtended()
            {
                
    /* @var $oSql \Zend\Db\Sql\Select */

                
    $oSql $this->_oTableGateway->getSql()->select();
                
    $oSql->order('admin_berechtigung.berechtigung_id ASC');
                
    $oSql->join('admin_berechtigung_ziel',
                            
    'admin_berechtigung_ziel.berechtigung_id = admin_berechtigung.berechtigung_id',
                            [
    'target_berechtigung_ziel_id'    => 'berechtigung_ziel_id',
                             
    'target_berechtigung_id'         => 'berechtigung_id',
                             
    'target_ziel'                        => 'ziel',
                             
    'target_last_modified'         => 'last_modified']);

                
    $oResultSet $this->_oTableGateway->selectWith($oSql);

                return 
    $oResultSet->current();
            }
        } 

    Laut deinem Buch sollte dieses Beispiel auch funktionieren. Dies klappt leider auch nicht bei mir.
    PHP-Code:
    $aData =
                [
                    
    'berechtigung_id'                 => 1,
                    
    'bezeichnung'                     => 'Test',
                    
    'position'                         => 9,
                    
    'last_modified'                 => date('Y-m-d H:i:s'),
                    
    'target_berechtigung_ziel_id'     => 1,
                    
    'target_berechtigung_id'         => 1,
                    
    'target_ziel'                     => 'asdfasdfasdf',
                    
    'target_last_modified'             => date('Y-m-d H:i:s'),
                ];

                
    $oEntity = new PermissionEntity();

                
    $oHydrator = new PermissionHydrator();
                
    $oHydrator->hydrate($aData$oEntity);

                
    var_dump($oEntity);
                
    var_dump($oHydrator->extract($oEntity)); 

  15. #15
    Super-Moderator Avatar von Kaiuwe
    Registriert seit
    30.12.2006
    Beiträge
    5.447
    Thanks
    3
    Thanked 346 Times in 277 Posts

    Standard

    Zitat Zitat von rainman1983 Beitrag anzeigen
    Dies klappt leider auch nicht bei mir.
    Debugger verwenden und prüfen, was beim „PermissionTargetHydrator“ überhaupt ankommt.

    Du solltest auch einzeln prüfen: werden durch den Hydrator „PermissionTargetHydrator“ alle Daten für das Objekt „PermissionTargetEntity“ korrekten gesetzt. (Stichwort „Unit-Tests“)
    Geändert von Kaiuwe (13.02.2017 um 12:07 Uhr)
    Zum Zend Framework stehen jedem folgende Quellen zum Nachschlagen zur Verfügung:

  16. #16
    Erfahrener Benutzer Avatar von Ralf
    Registriert seit
    14.12.2006
    Beiträge
    436
    Thanks
    0
    Thanked 46 Times in 36 Posts

    Standard

    Kannst du nochmal den Aufbau deiner beiden Tabellen posten, die du joinen möchtest?

    Danke, Ralf

  17. #17
    Erfahrener Benutzer
    Registriert seit
    05.09.2008
    Beiträge
    308
    Thanks
    0
    Thanked 3 Times in 1 Post

    Standard

    Die TargetEntity wird korrekt über den TargetHydrator gefüllt.

    Die Tabellenstruktur:
    Code:
    CREATE TABLE `admin_berechtigung` (
      `berechtigung_id` tinyint(2) NOT NULL,
      `bezeichnung` varchar(30) COLLATE utf8_unicode_ci NOT NULL,
      `position` tinyint(2) NOT NULL,
      `last_modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
    
    
    CREATE TABLE `admin_berechtigung_ziel` (
      `berechtigung_ziel_id` tinyint(3) NOT NULL,
      `berechtigung_id` tinyint(2) NOT NULL,
      `ziel` varchar(60) COLLATE utf8_unicode_ci NOT NULL,
      `last_modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

    Da das obige Beispiel nicht funktioniert, habe ich mal dein Beispiel mit AdvertEntity und CompanyEntity bei mir nachgebaut. Leider funktioniert dies bei mir auch nicht.

    PHP-Code:
    $aData =
                [
                    
    'id'             => 10,
                    
    'company_id'     => 20,
                    
    'company_name'     => 'BG',
                ];


                
    $oEntity = new AdvertEntity();

                
    $oHydrator = new AdvertHydrator();
                
    $oHydrator->hydrate($aData$oEntity);

                
    var_dump($oEntity);
                
    var_dump($oHydrator->extract($oEntity)); 
    Geändert von rainman1983 (15.02.2017 um 20:37 Uhr)

  18. #18
    Super-Moderator Avatar von Kaiuwe
    Registriert seit
    30.12.2006
    Beiträge
    5.447
    Thanks
    3
    Thanked 346 Times in 277 Posts

    Standard

    Zitat Zitat von rainman1983 Beitrag anzeigen
    Die TargetEntity wird korrekt über den TargetHydrator gefüllt.
    Gut, damit können wir dies ausschließen.

    Jetzt würde ich die Strategie „PermissionTargetEntityStrategy“ einzeln prüfen.
    Zum Zend Framework stehen jedem folgende Quellen zum Nachschlagen zur Verfügung:

  19. #19
    Erfahrener Benutzer
    Registriert seit
    05.09.2008
    Beiträge
    308
    Thanks
    0
    Thanked 3 Times in 1 Post

    Standard

    PermissionTargetEntityStrategy
    PHP-Code:
    class PermissionTargetEntityStrategy implements StrategyInterface
        
    {
            private 
    $_oHydrator;

            public function 
    __construct(HydratorInterface $oHydrator)
            {
                
    $this->_oHydrator $oHydrator;
            }

            public function 
    extract($oValue)
            {
                if (
    $oValue instanceof PermissionTargetEntity)
                {
                    return 
    $oValue->getBerechtigungZielId();
                }

                return 
    $oValue;
            }

            public function 
    hydrate($sValue$aData = [])
            {
                
    $aTargetData = [];

                foreach (
    $aData as $sKey => $sValue)
                {
                    
    $sSearch       'target_';
                    
    $iLengthSearch strlen($sSearch);

                    if (
    substr($sKey0$iLengthSearch) != $sSearch)
                    {
                        continue;
                    }

                    
    $aTargetData[substr($sKey$iLengthSearch)] = $sValue;
                }

                
    $oEntity = new PermissionTargetEntity();
                
    $this->_oHydrator->hydrate($aTargetData$oEntity);

                return 
    $oEntity;
            }
        } 
    Wenn ich in jede Methode, eine Ausgabe hinzufüge, dann stelle ich fest, dass nur der Constructor aufgerufen wird, aber nicht die anderen beiden Funktionen.

    Wer muss die beiden Methoden extract und hydrate triggern? Ich denke, die hydrate müsste ausgeführt werden.

  20. #20
    Erfahrener Benutzer Avatar von Ralf
    Registriert seit
    14.12.2006
    Beiträge
    436
    Thanks
    0
    Thanked 46 Times in 36 Posts

    Standard

    Das ist genau das Problem, dass ich bisher leider erfolglos vermitteln wollen. Konnte mich bisher offenbar nicht verständlich ausdrücken. Deine Datenbankabfrage muss am Ende eine Spalte mit demselben Namen zurück liefern, für den die die Hydratorstrategie definierst hast. Wenn du die Strategy dem Feld "meine_spalte" zuweist, muss der SELECT eine solche Spalte enthalten. Entweder heisst die Spalte direkt so oder du vergibst einen Alias.

Seite 1 von 2 1 2 LetzteLetzte

Ähnliche Themen

  1. Select mit Array-Funktion
    Von JulienP88 im Forum ZF2 Formulare
    Antworten: 16
    Letzter Beitrag: 23.05.2013, 14:38
  2. Select query cannot join with another table
    Von herr_gumba im Forum DB
    Antworten: 10
    Letzter Beitrag: 21.02.2011, 17:59
  3. Antworten: 4
    Letzter Beitrag: 01.01.2010, 15:44
  4. Select und Join Frage
    Von tzander im Forum DB
    Antworten: 1
    Letzter Beitrag: 23.06.2009, 14:43
  5. Antworten: 12
    Letzter Beitrag: 29.11.2007, 02:14

Lesezeichen

Berechtigungen

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