Contao-Camp 2024
Ergebnis 1 bis 18 von 18

Thema: Relations und getRelated

  1. #1
    Alter Contao-Hase
    Registriert seit
    18.07.2012.
    Ort
    Löbau
    Beiträge
    1.137

    Standard Relations und getRelated

    Hallo, ich bin grad dabei mal eins meiner privaten Module zu optimieren

    Aber irgendwie komm ich aktuell nicht damit klar...

    folgender Aufbau ist vorhanden:

    tl_fs_event_tourneen
    PHP-Code:
            'band' => array
            (
                
    'foreignKey'              => 'tl_fs_bands.id',
                
    'relation'                  => ['type'=>'belongsTo''load'=>'eager'],
            ), 

    tl_fs_event_tourneen_attachments
    PHP-Code:
            'pid' => array
            (
                
    'foreignKey'            => 'tl_fs_event_tourneen.id',
                
    'relation'                => ['type'=>'belongsTo''load'=>'eager'],
            ), 

    jetzt dachte ich ich kann es so lösen:

    PHP-Code:
                    $objTourAtt FsEventTourneenAttachmentsModel::findBy(array('j1.published=?''j1.band IN('.implode(','$bands).')'), array(1), array('order' => 'tstamp DESC''limit' => $model->fs_limit));
                    if(
    $objTourAtt !== null) {
                        while(
    $objTourAtt->next()) {
                            
    $tour $objTourAtt->getRelated('pid');    
                            
    $band $tour->getRelated('band');    
    .... 
    leider meldet er mir immer "Warning: Undefined array key 0" in de Zeile $band = $tour->getRelated('band');

    Nur so kurz zu Erläuterung der DB

    Jeder Tournee kann eine Band zugeordnet werden aber jeder Tour eben mehreres Zeug


    Edit:
    tour tabelle bleibt arrRelated leer?
    Code:
        [arrRelations:protected] => Array
            (
                [band] => Array
                    (
                        [table] => tl_fs_bands
                        [field] => id
                        [type] => belongsTo
                        [load] => eager
                    )
    
            )
    
        [arrRelated:protected] => Array
            (
            )
    Geändert von WebRoxx (06.12.2022 um 10:02 Uhr)
    Liebe Grüße
    WebRoxx


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

    Standard

    Zitat Zitat von WebRoxx Beitrag anzeigen
    leider meldet er mir immer "Warning: Undefined array key 0" in de Zeile $band = $tour->getRelated('band');
    Nutze den Debug-Modus und poste den Stack Trace.
    » sponsor me via GitHub or PayPal or Revolut

  3. #3
    Alter Contao-Hase
    Registriert seit
    18.07.2012.
    Ort
    Löbau
    Beiträge
    1.137

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Nutze den Debug-Modus und poste den Stack Trace.

    Code:
    ErrorException:
    Warning: Undefined array key 0
    
      at vendor/contao/core-bundle/src/Resources/contao/library/Contao/Model.php:1052
      at Contao\Model::find(array('limit' => 1, 'column' => 'id', 'value' => array('id' => 1, 'tstamp' => 1613559594, 'sorting' => 128, 'title' => 'Die Ärzte', 'alias' => 'die-aerzte', 'unpublished' => 0), 'return' => 'Model'))
         (vendor/contao/core-bundle/src/Resources/contao/library/Contao/Model.php:917)
      at Contao\Model::findOneBy('id', array('id' => 1, 'tstamp' => 1613559594, 'sorting' => 128, 'title' => 'Die Ärzte', 'alias' => 'die-aerzte', 'unpublished' => 0), array('limit' => 1, 'column' => 'id', 'value' => array('id' => 1, 'tstamp' => 1613559594, 'sorting' => 128, 'title' => 'Die Ärzte', 'alias' => 'die-aerzte', 'unpublished' => 0), 'return' => 'Model'))
         (vendor/contao/core-bundle/src/Resources/contao/library/Contao/Model.php:601)
      at Contao\Model->getRelated('band')
         (vendor/webroxx/contao-fansite-manager-core-bundle/src/Controller/FrontendModule/FsChangeHistoryController.php:99)
      at WEBROXX\FansiteManagerCore\Controller\FrontendModule\FsChangeHistoryController->getResponse(object(FragmentTemplate), object(ModuleModel), object(Request))
         (vendor/contao/core-bundle/src/Controller/FrontendModule/AbstractFrontendModuleController.php:40)
      at Contao\CoreBundle\Controller\FrontendModule\AbstractFrontendModuleController->__invoke(object(Request), object(ModuleModel), 'main', null)
         (vendor/symfony/http-kernel/HttpKernel.php:163)
      at Symfony\Component\HttpKernel\HttpKernel->handleRaw(object(Request), 2)
         (vendor/symfony/http-kernel/HttpKernel.php:75)
      at Symfony\Component\HttpKernel\HttpKernel->handle(object(Request), 2, false)
         (vendor/symfony/http-kernel/HttpCache/SubRequestHandler.php:86)
      at Symfony\Component\HttpKernel\HttpCache\SubRequestHandler::handle(object(HttpKernel), object(Request), 2, false)
         (vendor/symfony/http-kernel/Fragment/InlineFragmentRenderer.php:80)
      at Symfony\Component\HttpKernel\Fragment\InlineFragmentRenderer->render('/_fragment?_path=_format%3Dhtml%26_locale%3Dde%26_controller%3Dcontao.frontend_module.fs_change_history', object(Request), array('ignore_errors' => false))
         (vendor/symfony/http-kernel/Fragment/FragmentHandler.php:85)
      at Symfony\Component\HttpKernel\Fragment\FragmentHandler->render(object(FrontendModuleReference), 'forward', array('ignore_errors' => false))
         (vendor/contao/core-bundle/src/Fragment/FragmentHandler.php:69)
      at Contao\CoreBundle\Fragment\FragmentHandler->render(object(FrontendModuleReference))
         (vendor/contao/core-bundle/src/Resources/contao/modules/ModuleProxy.php:60)
      at Contao\ModuleProxy->generate()
         (vendor/contao/core-bundle/src/Resources/contao/elements/ContentModule.php:59)
      at Contao\ContentModule->generate()
         (vendor/contao/core-bundle/src/Resources/contao/library/Contao/Controller.php:616)
      at Contao\Controller::getContentElement(object(ContentModel), 'main')
         (vendor/contao/core-bundle/src/Resources/contao/modules/ModuleArticle.php:197)
      at Contao\ModuleArticle->compile()
         (vendor/contao/core-bundle/src/Resources/contao/modules/Module.php:214)
      at Contao\Module->generate()
         (vendor/contao/core-bundle/src/Resources/contao/modules/ModuleArticle.php:70)
      at Contao\ModuleArticle->generate(false)
         (vendor/contao/core-bundle/src/Resources/contao/library/Contao/Controller.php:544)
      at Contao\Controller::getArticle(object(ArticleModel), false, false, 'main')
         (vendor/contao/core-bundle/src/Resources/contao/library/Contao/Controller.php:386)
      at Contao\Controller::getFrontendModule('0', 'main')
         (vendor/contao/core-bundle/src/Resources/contao/pages/PageRegular.php:190)
      at Contao\PageRegular->prepare(object(PageModel))
         (vendor/contao/core-bundle/src/Resources/contao/pages/PageRegular.php:60)
      at Contao\PageRegular->getResponse(object(PageModel), true)
         (vendor/contao/core-bundle/src/Resources/contao/controllers/FrontendIndex.php:320)
      at Contao\FrontendIndex->renderPage(object(PageModel))
         (vendor/symfony/http-kernel/HttpKernel.php:163)
      at Symfony\Component\HttpKernel\HttpKernel->handleRaw(object(Request), 1)
         (vendor/symfony/http-kernel/HttpKernel.php:75)
      at Symfony\Component\HttpKernel\HttpKernel->handle(object(Request), 1, true)
         (vendor/symfony/http-kernel/Kernel.php:202)
      at Symfony\Component\HttpKernel\Kernel->handle(object(Request))
         (public/index.php:44)
    Liebe Grüße
    WebRoxx


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

    Standard

    Ich denke mit load => eager hast du unter $objTourAtt->pid und $tour->band bereits die richtigen Daten.
    » sponsor me via GitHub or PayPal or Revolut

  5. #5
    Alter Contao-Hase
    Registriert seit
    18.07.2012.
    Ort
    Löbau
    Beiträge
    1.137

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Ich denke mit load => eager hast du unter $objTourAtt->pid und $tour->band bereits die richtigen Daten.
    wie meinst du das? $tour ist ja getRelated und ich benötige im weiteren dann die Id der band... aber soweit kommt es ja nicht da es ja den fehler raushaut
    Liebe Grüße
    WebRoxx


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

    Standard

    Prüfe mal was sich in $objTourAtt->pid und $tour->band befindet.
    » sponsor me via GitHub or PayPal or Revolut

  7. #7
    Alter Contao-Hase
    Registriert seit
    18.07.2012.
    Ort
    Löbau
    Beiträge
    1.137

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Prüfe mal was sich in $objTourAtt->pid und $tour->band befindet.
    $objTourAtt->pid = die tour id
    $tour->band = ein array mit den band daten

    ich brauch aber ja alles der tour also title, year, alias und den bandname und id

    dehalb ja getRelated und sehe ich das falsch
    Liebe Grüße
    WebRoxx


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

    Standard

    Contao hat dir aber in der "band" Variable schon die Band Daten reingeladen - daher scheint dort getRelated dann nicht mehr zu funktionieren.
    » sponsor me via GitHub or PayPal or Revolut

  9. #9
    Alter Contao-Hase
    Registriert seit
    18.07.2012.
    Ort
    Löbau
    Beiträge
    1.137

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Contao hat dir aber in der "band" Variable schon die Band Daten reingeladen - daher scheint dort getRelated dann nicht mehr zu funktionieren.
    Oh ich seh grad irgendwas stimmt nicht... und ist auch komisch oder ich seh den fehler nicht

    ich hab folgenden code

    PHP-Code:
                //tourneen start
                
    if($cat == 'TOUR') {
                    
                    
    $objTour FsEventTourneenModel::findBy(array('published=?','band IN('.implode(','$bands).')'), array(1), array('order' => 'tstamp DESC''limit' => $model->fs_limit));
                    if(
    $objTour !== null) {
                        while(
    $objTour->next()) {

                            
    $modulFields = array('type=?','fs_band LIKE ?');
                            
    $moduleValues = array('fs_tour_archiv',"%".serialize(strval($objTour->band))."%");                
                            
    $tourPage ModuleModel::findOneBy($modulFields,$moduleValues);        
                            
                            
    $jumpTo $tourPage->jumpTo;
                            
    $band $objTour->getRelated('band');

                            
    $objTour->band    $band->row();
                            
    $objTour->href  = ($jumpTo) ? Controller::generateFrontendUrl(PageModel::findPublishedByIdOrAlias($jumpTo)->row(), "".($GLOBALS['TL_CONFIG']['useAutoItem'] ?  '/' '/items/').$objTour->alias) : '';
                        }
                        
    $versionArray[$cat] = $objTour->fetchAll();
                    }
                }
                    
                if(
    $cat == 'TOURATTACHMENT') {
                    
    #$objTourAtt = FsEventTourneenAttachmentsModel::findTourAttachmentsHistory(array('t.published=?', 't.band IN('.implode(',', $bands).')'), array(1), array('limit' => $model->fs_limit));
                    
    $objTourAtt FsEventTourneenAttachmentsModel::findBy(array('j1.published=?''j1.band IN('.implode(','$bands).')'), array(1), array('order' => 'tstamp DESC''limit' => $model->fs_limit));
                    if(
    $objTourAtt !== null) {
                        while(
    $objTourAtt->next()) {
                            
    #print_r($objTourAtt->pid);
                            
    $tour $objTourAtt->getRelated('pid');    
                            
    print_r($tour->band);


                            
    $modulFields = array('type=?','fs_band LIKE ?');
                            
    $moduleValues = array('fs_tour_archiv',"%".serialize(strval($tour->band))."%");                
                            
    $tourPage ModuleModel::findOneBy($modulFields,$moduleValues);        
                            
    $jumpTo $tourPage->jumpTo;
                                                
                            
    $objTourAtt->band    $band->row();
                            
    $objTourAtt->href  = ($jumpTo) ? Controller::generateFrontendUrl(PageModel::findPublishedByIdOrAlias($jumpTo)->row(), "".($GLOBALS['TL_CONFIG']['useAutoItem'] ?  '/' '/items/').$objTour->alias) : '';
                        }
                        
    $versionArray[$cat] = $objTourAtt->fetchAll();
                    }
                }
                
    //tourneen end 
    da ist $tour->band nur die ID, kommentiere ich das erste "if" aus ist $tour->band das array.... wie geht das denn?
    es wäre ja auch total geil wenn im twig in der pid bzw band auch die daten kommen würden aber gut das scheint nicht zu funktionieren

    EDIT: okay man darf wohl keine bestehende felder überschreiben wenn ich im ersten if $objTour->band_id = $band->row(); setze passt es dann unten auch... damit kann ich auch leben
    Geändert von WebRoxx (06.12.2022 um 14:14 Uhr)
    Liebe Grüße
    WebRoxx


  10. #10
    Alter Contao-Hase
    Registriert seit
    18.07.2012.
    Ort
    Löbau
    Beiträge
    1.137

    Standard

    So weiter im Text,

    wenn ich im den events (a) auf ein feld mit foreignKey & relation auf eine tabelle (b) verweise und in ein anderen tabelle (c) wieder raum auf events, müsste ich dann nicht ein join zu der tabelle (c) machen?

    frag mich eh ab wann man auf die joins doch verzichten sollte und es dann per extra db abfrage holt...

    hab da noch nie so drauf geachten im contao... weiß auch nicht wie es später in der 5 laufen wird...
    Geändert von WebRoxx (07.12.2022 um 10:34 Uhr)
    Liebe Grüße
    WebRoxx


  11. #11
    Alter Contao-Hase
    Registriert seit
    18.07.2012.
    Ort
    Löbau
    Beiträge
    1.137

    Standard

    Gut belassen wir es eben so, ich kann ja auch eingene Modelfunctionen schreiben für gewisse Fälle,

    gibt es da ein "richtigen" weg um alle Daten ans twig zu übergeben?

    PHP-Code:
    $objResult MyModel::findByCustum(..)

    //geht bei standart findby nicht bei Custom
    $objResult ->fetchAll();

    //geht bei custom findby nicht bei standart
    $objResult ->fetchAllAssoc(); 
    hätte da gern ne gleiche Lösung, Custom Model ist aufgebaut wie hier;
    PHP-Code:
        public static function findByCustum($arrWhere$arrValue, array $arrOptions=array()) {
            
    $table = static::$strTable;
            
            
    // Defaults for limit and offset
            
    if(!isset($arrOptions['limit'])) {
                
    $arrOptions['limit'] = 0;
            }
            
            if(!isset(
    $arrOptions['offset'])) {
                
    $arrOptions['offset'] = 0;
            }
            
            
    $queryWhere = ($arrWhere) ? 'WHERE '.implode(" AND "$arrWhere) : '' ;
            
            
    $data Database::getInstance()->prepare("db abfrage");    
                
            
    // Limit
            
    if($arrOptions['limit'] > || $arrOptions['offset'] > 0) {
                
    $data->limit($arrOptions['limit'], $arrOptions['offset']);
            }
            
            
    $objStatement = static::preFind($data);
            
    $objResult $data->execute($arrValue);
            
            if (
    $objResult->numRows 1)
            {
                return  
    null;
            }
                    
            return 
    $objResult;    
        } 
    Liebe Grüße
    WebRoxx


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

    Standard

    Du kannst ja auch direkt das Model Objekt an Twig übergeben, spielt ja keine große Rolle.
    » sponsor me via GitHub or PayPal or Revolut

  13. #13
    Alter Contao-Hase
    Registriert seit
    18.07.2012.
    Ort
    Löbau
    Beiträge
    1.137

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Du kannst ja auch direkt das Model Objekt an Twig übergeben, spielt ja keine große Rolle.
    Also nur $objResult ?

    Da steht aber bei Events zum beispiel alles in
    Code:
          #arrModels: array:10 [?
            0 => Contao\CalendarEventsModel {#1628 ?}
            1 => Contao\CalendarEventsModel {#1657 ?}
            2 => Contao\CalendarEventsModel {#1640 ?}
            3 => Contao\CalendarEventsModel {#1618 ?}
            4 => Contao\CalendarEventsModel {#1602 ?}
            5 => Contao\CalendarEventsModel {#1616 ?}
            6 => Contao\CalendarEventsModel {#1645 ?}
            7 => Contao\CalendarEventsModel {#1633 ?}
            8 => Contao\CalendarEventsModel {#1642 ?}
            9 => Contao\CalendarEventsModel {#1629 ?}
          ]
        }
    und bei mein custom ist es "resultSet" statt "arrModel" und es wird sogar die DB abfrage mit übergeben
    Liebe Grüße
    WebRoxx


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

    Standard

    Not sure what to tell you . Oder hast du eine spezifische Frage?
    » sponsor me via GitHub or PayPal or Revolut

  15. #15
    Alter Contao-Hase
    Registriert seit
    18.07.2012.
    Ort
    Löbau
    Beiträge
    1.137

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Not sure what to tell you . Oder hast du eine spezifische Frage?
    Es bringt docn nicht wenn die Daten immer anders im Twig abzurufen sind und ob im twig ne SQL Abfrage sein muss bezweifel ich auch... ich möchte halt die Daten immer in gleicher Art und Weise im Twig haben

    Edit:

    okay im CustomModel einfach das als return return static::createCollectionFromDbResult($objResult, static::$strTable); und dann klappt auch fetchAll
    Geändert von WebRoxx (07.12.2022 um 12:03 Uhr)
    Liebe Grüße
    WebRoxx


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

    Standard

    Ja, dann einfach das Model übergeben. Sorry, ich glaube ich verstehe nicht wirklich was du erreichen oder fragen willst.
    » sponsor me via GitHub or PayPal or Revolut

  17. #17
    Alter Contao-Hase
    Registriert seit
    18.07.2012.
    Ort
    Löbau
    Beiträge
    1.137

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Ja, dann einfach das Model übergeben. Sorry, ich glaube ich verstehe nicht wirklich was du erreichen oder fragen willst.
    ja es lag dran das die standart "findby" collection zurückgeben aber ich im meinen nur ein result... habs angepasst jetzt kann ic hda auch fetchAll verwenden
    Liebe Grüße
    WebRoxx


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

    Standard

    Zitat Zitat von WebRoxx Beitrag anzeigen
    ja es lag dran das die standart "findby" collection zurückgeben aber ich im meinen nur ein result...
    Du kannst findOneBy nutzen statt dessen, dann bekommst du immer ein Model. Oder du sagst
    PHP-Code:
    ['return' => 'Model'
    für den $options Parameter.
    » sponsor me via GitHub or PayPal or Revolut

Aktive Benutzer

Aktive Benutzer

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

Lesezeichen

Lesezeichen

Berechtigungen

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