Cgridview Bestimmten Einzelnen Wert Aus Many_Many Model Holen

Hallo Liebe Yii Gemeinde,

Also ich habe die Google Suchfunktion gequält aber das Problem liegt wohl mehr am noch fehlenden tieferen Verständnis und an den richtigen Suchbegriffen.

Es ist auch relativ einfach was ich möchte.

Vereinfach:

Ich habe 2 Tabellen.

Contacts mit

id (PK), name, etc

phoneToContacts mit id (PK), contact_id, number, priority

Jetzt würde ich gerne ein CGridView machen in dem Name, sonstige Felder und die Telefonnummer diese Kontaktes mit der Priorität 1 angezeigt wird.

Priorität und contact_id sind über UNIQUE miteinander verbunden, es kann also nur eine 1. Telefonnummer geben.

Ich bin auch schon soweit gekommen das ich im Model eine Methode schreiben muss. Nur in welchem und wie sie aussehen sollte daran hab ich mir die Zähne ausgebissen. Ein Schubs in die richtige Richtung was Suchbegriffe oder Methode angeht und ich Poste die Lösung hier nochmal extra damit Zukünftig suchende die Lösung sofort haben :wink:

Herzlichen Dank Niki

P.S. Ich hab die Falsche Überschrift. Es ist eine self::HAS_MANY Verknüpfung. Ist im Model auch so richtig angegeben.

Die einfachste Variante wäre im Model Contacts eine Methode zu schreiben. Irgendwas wie allPhones().

In dieser Funktion könntest du dann auf das Model phoneToContacts zugreifen. Du suchst alle mit der contact_id heraus, die gleich der aktuellen ID von dem Model Contacts ist.

Ungefähr so:




phoneToContacs::model()->findAll('contact_id = :c',array(':c'=>$this->id));



Du könntest dann mit dem Model Contacts->allPhones() darauf zugreifen.

Damit würdest du alle Telefonnummern zu diesem Kontakt auslesen. Wählst du stattdessen find(), nimmst du nur einen Eintrag aus phoneToContacts.

Wenn du find() gewählt hast, würde dir vermutlich so etwas als Spaltendefinition in der CGridView reichen:




        array(   

            'name'=>'Phonenumber',

            'value'=>'CHtml:encode($data->allPhones()->number)',

        ),



Wenn du findAll() gewählt hast, erhälst du eine beliebige Menge von Einträgen für einen Kontakt.

Ich persönlich würde in der allPhones-Funktion schon einen fertigen HTML-Code erstellen und es dann als String zurückgeben.

Z.B.:




$str = '<ul>';

$numbers = 

phoneToContacs::model()->findAll('contact_id = :c',array(':c'=>$this->id));


if ($numbers != null)

{

foreach($numbers as $num)

{

$str.='<li>'.$num->number.'</li>';

}

}

$str.'</ul>';

return $str;



Dann könnte die Spalte ungefähr so definiert werden:




        array(            

            'name'=>'Phonenumber',

            'value'=>'$data->allPhones()',

        ),



Du könntest es natürlich mit den hinterlegten Relationen machen, doch finde ich jetzt auf die Schnelle den dafür nötigen Code nicht. -.- Sorry … Vielleicht kann dir da jemand anderes helfen

Ich hoffe, die Verwirrung hält sich in Grenzen,

Riff.

Im model:




	public function primaryNumber() {

	  $return = ''; 

	  

	  foreach ($this->primaryPhone as $numbers) {

	    $return .= $numbers->number;

	  }

	  return $return;

	}


	public function secondaryNumber() {

	  $return = ''; 

	  

	  foreach ($this->secondaryPhone as $numbers) {

	    $return .= $numbers->number;

	  }

	  return $return;

	}


	/**

	 * @return array relational rules.

	 */

	public function relations()

	{

		// NOTE: you may need to adjust the relation name and the related

		// class name for the relations automatically generated below.

		return array(

			etc...

			'primaryPhone' => array(self::HAS_MANY, 'PhoneToContact', 'contact_id', 'condition'=>'priority = 1'),

			'secondaryPhone' => array(self::HAS_MANY, 'PhoneToContact', 'contact_id', 'condition'=>'priority = 2'),



Ohne foreach funkioniert es nicht. Keine Ahnung wieso. Aber mit klappt alles wie es soll.

Herzlichen Dank an Riff. Das hat mir sehr geholfen die Lösung zu finden.

Gern geschehen. :)

Mit der foreach-Schleife kann ich dir noch erklären.

Du hast eine HAS_MANY-Beziehung, theoretisch kann daher auf einen Kontakt eine beliebige Anzahl an Telefonnummern kommen und du erhälst deshalb eine Menge von Ergebnissen. Dadurch brauchst du eine foreach-Schleife. :)