Yii Framework Forum: Anzeige Von Daten Aus Einer Has_Many Beziehung - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

Anzeige Von Daten Aus Einer Has_Many Beziehung Rate Topic: -----

#1 User is offline   reburg 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 61
  • Joined: 15-January 13

Posted 24 August 2013 - 11:05 AM

Hallo,

ich schaffe das einfach nicht - trotz Studium des Manual Artikels über Relationale Active Records:

Tabelle Sammelhefte ist mit Tabelle Noten verknüpft und Noten mit Komponisten:

// model Sammelhefte
public function relations()
{
        return array(
            'Werke'=>array(self::HAS_MANY, 'Noten', 'Sammelheft_Id'),
        );
}


Tabelle Noten ist mit Komponisten verknüpft:

// model Noten
public function relations() {
    return array(
        'Komponist'=>array(self::BELONGS_TO, 'Komponisten', 'Komponist_Id'),
        );
}


Ich möchte zu jedem Datensatz in der Tabelle Sammelhefte alle Komponistennamen mit einer Funktion ausgeben.

public function getComposerList () { 
   $Werke = Noten::model()->with("Komponist")->findByAttributes(array("Sammelheft_Id"=>$this->Id));
   $KomponistenListe = "";
   if ( is_array ($Werke)) {
 	foreach ( $Werke as $Werk ) $KomponistenListe .= $Werk->Zuname."\n";
   }
   return $KomponistenListe;
}

Alle meine Versuche scheiterten an diversen Fehlermeldungen. Die Funktion GetComposerList liefert zwar keinen Fehler aber auch keine Daten, Das Array ist also offensichtlich leer.

Habe jetzt eine längere Pause mit Yii gemacht und stehe leider wieder da wie am Anfang :angry:
Danke im Voraus für jede Hilfe.

Ferdinand
Greetings from Austria
Ferdinand
0

#2 User is offline   mbi 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 604
  • Joined: 08-May 09

Posted 24 August 2013 - 01:09 PM

für mich logisch müsste in die komponentenliste $Werk->Komponist->Zuname

und $werk->Zuname schmeisst keinen Fehler? wundert mich.
0

#3 User is offline   reburg 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 61
  • Joined: 15-January 13

Posted 24 August 2013 - 03:51 PM

Der Fehler lag darin, dass es in der Tabelle Sammelhefte offensichtlich auch Datensätze gibt, bei denen die Komponist_Id NULL ist. Das habe ich nun abgefangen. Es funktioniert jetzt mit folgendem Code.
public function getComposerList () {
  $Werke = Noten::model()->with("Komponist")->findAll(array("condition"=>"Sammelheft_Id=".$this->Id));
  $KomponistenListe = "";
  foreach ( $Werke as $Werk ) {
      if ( $Werk->Komponist_Id ) {
          $Name = $Werk->Komponist->Vorname." ".$Werk->Komponist->Zuname;
          $KomponistenListe .= $Name.", ";
      }
  }
  return rtrim($KomponistenListe,", ");
}


Was mir jetzt noch fehlt:
Jeder Komponist sollte in der Liste nur einmal vorkommen. Wie kann ich das mit Yii in die Parameter von findAll() einbauen? Das Problem ist, dass die Übereinstimmung über 2 Felder (Vorname und Zuname) gehen muss. Oder muss ich das selber mit PHP irgendwie hinzaubern?
Greetings from Austria
Ferdinand
0

#4 User is offline   mbi 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 604
  • Joined: 08-May 09

Posted 24 August 2013 - 04:03 PM

als erstes erstellst du eine methode im komponist-Model:

public function getFullname()
{
  return sprintf('%s %s, $this->Vorname, $this->Zuname);
}


dann sieht deine getComposerList zunächst so aus

public function getComposerList () {
  $Werke = Noten::model()->with("Komponist")->findAll(array("condition"=>"Sammelheft_Id=".$this->Id));
  $KomponistenListe = "";
  foreach ( $Werke as $Werk ) {
      if ( $Werk->Komponist ) {
          $KomponistenListe .= $Werk->Komponist->fullname .", ";
      }
  }
  return rtrim($KomponistenListe,", ");
}

0

#5 User is offline   mbi 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 604
  • Joined: 08-May 09

Posted 24 August 2013 - 04:07 PM

weiter

public function getComposerList ()
{
  $Werke = Noten::model()->with("Komponist")->findAll(array("condition"=>"Sammelheft_Id=".$this->Id));

  $KomponistenListe = array(); // array statt string verkettung

  foreach ( $Werke as $Werk ) {
      if ( $Werk->Komponist ) {
          if (!in_array($Werk->Komponist->fullname), $KomponistenListe) {
            $KomponistenListe[] = $Werk->Komponist->fullname;
          }
      }
  }

  return implode(', ', $KomponistenListe);
}

0

#6 User is offline   reburg 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 61
  • Joined: 15-January 13

Posted 26 August 2013 - 06:32 AM

Danke herzlich für die Hilfe.
Der noch leicht abgeänderte Code zeigt mir die Liste der Komponisten in der CGridView korrekt an:
// Methode im model Komponisten:
public function getFullNameCommon() {
  	return sprintf('%s %s', $this->Vorname, $this->Zuname);
}

// Methode im model Sammelhefte:
public function getComposerList () {
$Werke = Noten::model()->with("Komponist")->findAll(array("condition"=>"Sammelheft_Id=".$this->Id));
	$KomponistenListe = array(); 
	foreach ( $Werke as $Werk ) {
		if ( $Werk->Komponist ) {
			$Komponist = $Werk->Komponist->fullNameCommon;
			if (! in_array($Komponist, $KomponistenListe)) {
				$KomponistenListe[] = $Komponist;
			}
		}
	}
	return implode(', ', $KomponistenListe);
}


Wie kann ich nun diese Komponistenliste, die von obiger Funktion bei jedem Datensatz im GridView Sammelhefte ausgegeben wird, für die Suche verwenden?

Folgendes scheitert jedenfalls:
public function search() {
    $criteria=new CDbCriteria;
    $criteria->compare('t.Id',$this->Id);
    $criteria->compare('Liste_Komponisten',$this->composerList,true);

Greetings from Austria
Ferdinand
0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users