501 Nachrichten unter 141 Themen von 115 Mitgliedern
[SilverStripe Roadmap][Changelog]

Dataobject::get Where, ungleich und mit Variablen

Seite: 1 847 mal gelesen
  • Dobby
    Dobby Community Member
    1 Beitrag

    Dataobject::get Where, ungleich und mit Variablen

    Hallo,

    wir versuchen derzeit in einer Funktion mit einem DB::query innerhalb dieser Abfrage nochmal zwei DataObjects auszuführen. Das zweite hängt vom ersten ab, so dass in der zweiten Abfrage das Ergebnis der ersten ausgeschlossen wird. Aber wir bekommen es nicht hin. Unter anderem bekommen wir ein "Trying to get property of non-object".

    Hier ist der Code. Vielleicht hat jemand von euch eine Idee und wir sehen den Fehler nicht mehr weil wir das Zeug schon zu lange anstarren.


    public function AuswertungFam()    {
       
    //$records = DB::query("SELECT `ElternstundenErfassen`.*,`Member`.`Surname`, `Member`.`FirstName`, sum(`ElternstundenErfassen`.`Dauer`) as stunden FROM `ElternstundenErfassen` left join `Member` ON `Member`.`ID`=`ElternstundenErfassen`.`Personen_ID` group by `ElternstundenErfassen`.`Familien_ID`,`Member`.`Surname`");
    $records = DB::query("SELECT `ElternstundenErfassen`.*,`Member`.`Sollstunden`, sum(`ElternstundenErfassen`.`Dauer`) as stunden FROM `ElternstundenErfassen` left join `Member` ON `Member`.`ID`=`ElternstundenErfassen`.`Personen_ID` group by `ElternstundenErfassen`.`Familien_ID`");

    foreach($records as $record){

    //$fam1 = $record['Familien_ID'];
    //$result_name1 = DB::query("SELECT Surname FROM Member WHERE Familien_ID = ".$record['Familien_ID']." ORDER BY Surname ASC ");
    $result_name1 = DataObject::get_one("Member", "Member.Familien_ID = ".$record['Familien_ID'],"Surname ASC");
    $record['name1'] = $result_name1->Surname;
    $record['vorname1'] = $result_name1->FirstName;
    $ID=$result_name1->ID;
    $Fam_ID=$record['Familien_ID'];
    $result2 = DataObject::get_one("Member", "Familien_ID = '.$Fam_ID.' AND ID <> '.$ID.'");
    //debug::dump($result_name1); die;
    $record['name2'] = $result2->Surname;
    //$record['vorname2'] = $result2->ID;
    //debug::dump($result2); die;
    // Mehr- oder Minderzeten berechnen
    $record['diff'] = $record['stunden']-$record['Sollstunden'];
    //Dauer in Uhrzeit umwandeln
    $record['stunden'] = (int) $record['stunden'] . ":" . sprintf ("%02d", ($record['stunden'] - (int) $record['stunden']) * 60);
    if ($record['diff'] > 0)
    $record['diff'] = (int) $record['diff'] . ":" . sprintf ("%02d", ($record['diff'] - (int) $record['diff']) * 60);
    else
    $record['diff'] = (int) $record['diff'] . ":" . sprintf ("%02d", ($record['diff'] - (int) $record['diff']) * -60);

    $objects[] = new $record['ClassName']($record);
    }

    if(isset($objects)) $doSet = new DataObjectSet($objects);

    else $doSet = new DataObjectSet();
    return $doSet;
          
    }
  • Lukin
    Lukin Community Member
    116 Beiträge

    Re: Dataobject::get Where, ungleich und mit Variablen

    Hi,

    den Fehler seh ich jetzt nich direkt. Möglicherweise habt ihr einfach einen falschen Feldnamen irgendwo?

    1. Ihr scheint da noch ein Silverstripe 2 am laufen zu haben. Das würde ich unbedingt ändern. Allein Sicherheitstechnisch hatte ich jetzt schon 2 mal den Fall, dass ein Proivder gesagt hat,. er lässt das nicht mehr auf seinen Server...

    2. Ich glaub ihr nutzt das Silverstripe Framework eigentlich garnich, oder?
    Die Tabell ElternstundenErfassen habt ihr händisch angelegt? Silverstripe vergibt ID Spalten eigentlich nach dem Schema NamederRelation+ID-> in eurem Fall müsste es dann eig so heißen FamilienID anstat Familie_ID .

    Wenn man die Relationen der verschiedenen Objekete schön anlegt, braucht man kaum bis kein SQL.
    Um Summen zu ziehen fügt man der Klasse eine entsprecheden Funktion (AlleStunden()) hinzu, die direkt auf die Relation geht.
    Das Framework nimmt euch viel der Arbeit ab.

    Folgender Aufbau wäre denkbar

    clas Familie extends Member{
    private static $has_many=array(
    'Elternstunden'=>'Elternstunde'
    );
    public function AlleStunden(){
    $stunden=0;
    foreach($this->Elternstunden() as $elternStunde ){
    $stunden+=$elternStunde->Stundenanzahl;
    }
    return $stunden;
    }
    }

    class Elternstunde extends DataObject{
    private static $db=array(
    'Datum'=>'Text',
    'Stundenanzahl'=>'Int'
    );
    private static $has_one=array(
    'Familie'=>'Familie'
    );
    }


    )

    }




Zur Zeit online: Zur Zeit ist leider niemand online.

Wir begrüßen unsere neuen Mitglieder: Robertgap