Yii - Vztah medzi tabulkami

Programovacie jazyky, rady, poradňa...
Numline1
Light Professional
Light Professional
Používateľov profilový obrázok
Príspevky: 858
Registrovaný: 04 dec 2006, 18:04

Yii - Vztah medzi tabulkami

Príspevok od používateľa Numline1 »

Ahojte, otazka je mierena hlavne na pouzivatelov frameworku Yii.

Budujem ticketovaci system (pre helpdesk ucely). Mam jeden model - Ticket a druhy model - TicketJournalUpdate.

Kód: Vybrať všetko

Tabulka ticket vyzera cca takto:
wo_id | field | field | field

Kód: Vybrať všetko

Tabulka ticket_journal_updates cca takto:
wo_ju_id | wo_id | text
wo_id je voci druhej tabulke vo vztahu HAS MANY, cize jeden ticket moze mat stovky journal updatov. Journal update je akysi freetext na updatovanie a komentovanie k aktualnemu stavu, analogicky by sa dalo povedat, ze komentare.

Moj problem spociva v tom, ze by som chcel v modeli Ticket mat prave jeden textarea, cez ktory by sa vytvarali nove journal updaty (s unikatnym primary key wo_ju_id) v druhej casti view by som chcel vypisat uz vsetky existujuce journal updaty (read only, najst idu podla wo_id ku ktoremu patria).

Som vsak uplne zaseknuty a neviem, ako by som to riesil, kedze s Yii prave zacinam.

Akakolvek rada je vitana, ak sa to podari vyriesit, budem velmi vdacny. :)
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8219
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: Yii - Vztah medzi tabulkami

Príspevok od používateľa harrison314 »

Tu mas k tomu example http://www.yiiframework.com/doc/guide/1 ... tabase.arr ,
ak som to spravne pochopil, tak ti ide o prepojenie modelov.
Apsolutne naj naj najjednoduchsie, je tie modely zmazat, doplnit do dtabazy cudzy kluc a nechat ich vygenerovat znovu aj s prepojeniami.
Numline1
Light Professional
Light Professional
Používateľov profilový obrázok
Príspevky: 858
Registrovaný: 04 dec 2006, 18:04

Re: Yii - Vztah medzi tabulkami

Príspevok od používateľa Numline1 »

Toto uz tak funguje, relation je dokonca definovana aj v modeli.

Kód: Vybrať všetko

'WOSJournalUpdate' => array(self::HAS_MANY, 'WOSJournalUpdate', 'woid'),
Momentalne sa mi podarilo dosiahnut, aby sa vytvarali nove zaznamy vo WOSJournalUpdate tabulke pri vytvoreni zaznamu vo Workorder tabulke (povodne nazvy v prvom poste boli TicketJournalUpdate a Ticket - len aby nedoslo k zmateniu).

Dosiahol som to pridanim par riadkov do actionCreate v controlleri:
Spoiler

Kód: Vybrať všetko

	public function actionCreate()
	{
		$model=new Workorder;
		$wos_journal_update=new WOSJournalUpdate;

		// Uncomment the following line if AJAX validation is needed
		// $this->performAjaxValidation($model);

		if(isset($_POST['Workorder'], $_POST['WOSJournalUpdate']))
		{
			$model->attributes=$_POST['Workorder'];
			$wos_journal_update->attributes=$_POST['WOSJournalUpdate'];

			$valid=$model->validate();
 
			if($valid)
			{
				if($model->save(false))
				{
					$wos_journal_update->woid = $model->woid;
					if($wos_journal_update->save())
					{
						$this->redirect(array('view','id'=>$model->woid));
					}
				}
			}
		}

		$this->render('create',array(
			'model'=>$model,
			'wos_journal_update'=>$wos_journal_update,
		));
	}
a par riadkov do create.php, aby vedel, ako renderovat a ktoremu modelu posielat data:

Kód: Vybrať všetko

<?php echo $this->renderPartial('_form', array('model'=>$model, 'wos_journal_update'=>$wos_journal_update)); ?>
($model je pseudonym pre workorder/ticket, aby som nemusel prepisovat vsetky views).

Nasledne uz to ide bez problemov, az na to, ze aj ked viem vytvorit zaznam, neviem ho nasledne upravit, kedze actionUpdate v controlleri je definovane takto:
Spoiler

Kód: Vybrať všetko

	public function actionUpdate($id)
	{
		$model=$this->loadModel($id);
		
		// Uncomment the following line if AJAX validation is needed
		// $this->performAjaxValidation($model);

		if(isset($_POST['Workorder']))
		{
			$model->attributes=$_POST['Workorder'];
			if($model->save())
				$this->redirect(array('view','id'=>$model->woid));
		}

		$this->render('update',array(
			'model'=>$model,
		));
	}
a Yii nepozna premennu $wos_journal_update
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8219
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: Yii - Vztah medzi tabulkami

Príspevok od používateľa harrison314 »

a Yii nepozna premennu $wos_journal_update
Skus napisat kde ti ju nepozna (alebo oznac v predchazdjucom prispevku)
Numline1
Light Professional
Light Professional
Používateľov profilový obrázok
Príspevky: 858
Registrovaný: 04 dec 2006, 18:04

Re: Yii - Vztah medzi tabulkami

Príspevok od používateľa Numline1 »

harrison314 napísal: Skus napisat kde ti ju nepozna (alebo oznac v predchazdjucom prispevku)
Nepoznal ju update.php view, to som uz vsak vyriesil, stacilo v actionUpdate v controlleri nadefinovat to, aby sa pri update len upravil Workorder a vytvoril uplne novy Journal Update, podobne ako pri actionCreate. Zajtra postnem kod, mam to bohuzial iba na pracovnom notebooku.

Zostava mi teda uz len jedina otazka: Ako vo Yii najlepsie vypisem vsetky Journal Updaty priradene k urcitemu Workorderu? Predpokladam, ze by to chcelo priamo pouzit Zii widget, aby som nemusel vytvarat vlastne html tabulky a query a mal to jednotne. Navrhy? Vopred vdaka.
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8219
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: Yii - Vztah medzi tabulkami

Príspevok od používateľa harrison314 »

so Zii ti nepomozem, v robote sme pouzivali vlastne widgety aj framework bol prekopany,
skus nato pouzit partial view a ten volat na kazdy journal

daco ako (len si to uz naozaj nepametam, je to rok a kody nemam pri sebe :D )

Kód: Vybrať všetko

foreach(Workorder::model()->findById($id)->WOSJournalUpdate as $journal)
{
  $this->renderPartial('_journal', array('journal'=>$journal));
}
Alebo vlastny widget.
AK ide o obycajne zobrazenie textu pod sebou tak to zobraz cez echo v nejakom dive s CSS layoutom.
Numline1
Light Professional
Light Professional
Používateľov profilový obrázok
Príspevky: 858
Registrovaný: 04 dec 2006, 18:04

Re: Yii - Vztah medzi tabulkami

Príspevok od používateľa Numline1 »

Dakujem, zajtra vyskusam a hodim feedback :).

//autoeditácia príspevku (30 Júl 2013, 10:00)
Ahoj, update po dlhsej dobe, funguje to takto:

Kód: Vybrať všetko

<?php
foreach(Workorder::model()->findByPk($model->woid)->WOSJournalUpdate as $journalUpdate)
{
	$this->renderPartial('_journalUpdate', array('journalUpdate'=>$journalUpdate));
}
?>
v _journalUpdate.php to nasledne riesim takto:

Kód: Vybrať všetko

<div class="view">

<?php $this->widget('zii.widgets.CDetailView', array(
	'data'=>$journalUpdate,
	'attributes'=>array(
		'woid',
		'wouid',
		'date_created',
		'status_update',
	),
));

?>

</div>
Este sa snazim dosiahnut, aby sa to zobrazilo cez CGridView, ale bez uspechu, kazdopadne vsak dakujem za cenne rady. :)
Napísať odpoveď