Yii Framework Forum: Cgridview Bestimmten Einzelnen Wert Aus Many_Many Model Holen - Yii Framework Forum

Jump to content

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

Cgridview Bestimmten Einzelnen Wert Aus Many_Many Model Holen Über $data->phoneToContact->Primary_Number eine einzelne Rate Topic: -----

#1 User is offline   Niki 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 6
  • Joined: 02-April 13

Posted 10 February 2014 - 07:06 AM

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 ;-)

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.
0

#2 User is offline   Riff 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 15
  • Joined: 04-June 13

Posted 10 February 2014 - 08:59 AM

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.
1

#3 User is offline   Niki 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 6
  • Joined: 02-April 13

Posted 10 February 2014 - 12:53 PM

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.
0

#4 User is offline   Riff 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 15
  • Joined: 04-June 13

Posted 11 February 2014 - 01:05 AM

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. :)
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