Cara Edit data Jika Primary Key berupa varchar

Para programmer yii… ::)

Di yii ane baru tau nih, ternyata sebuah tabel itu tidak bisa dilakukan (View, Update, Delete) jika Primary Key pada tabel tersebut bukan integer, buktinya ane punya tabel tipe datanya varchar, sama sekali tidak bisa tuh, yang ada muncul pesan




Error 404


The requested page does not exist.



ini contoh hasil generate dengan gii utk update.php




<?php

$this->breadcrumbs=array(

	'Products'=>array('index'),

	$model->ProductID=>array('view','id'=>$model->ProductID),

	'Update',

);


$this->menu=array(

	array('label'=>'List Product', 'url'=>array('index')),

	array('label'=>'Create Product', 'url'=>array('create')),

	array('label'=>'View Product', 'url'=>array('view', 'id'=>$model->ProductID)),

	array('label'=>'Manage Product', 'url'=>array('admin')),

);

?>


<h1>Update Product <?php echo $model->ProductID; ?></h1>


<?php echo $this->renderPartial('_form', array('model'=>$model)); ?>



Bagaimana yah solusinya? karena jika tipe datanya pada tabel tersebut saya ubah ke integer, maka banyak sekali yg di ubah krn banyak relasi ke tbl lain. Bagimana solusinya? apa yg harus saya ubah pada koding di atas?

Mohon sekali bantuannya…

kalau dilihat dari errornya kayaknya itu halaman ngak ketemu…, bukan berhubungan sama databasenya.

code controllernya kayak gimana ?

sepertinya ada di sini errornya:




'id'=>$model->ProductID



karena ‘id’ itukan integer sedangkan data dari database kamu varchar.

Sebelumnya terimakasih bersedia untuk membalas

Analisa awal ane juga seperti itu, tapi ternyata kalau di lihat URL nya itu ga masalah om, ini ane capture

1806

sa.JPG

Terus untuk controller juga sudah ada

ProductController.php




....


	public function actionUpdate($id)

	{

		$model=$this->loadModel($id);


		// Uncomment the following line if AJAX validation is needed

		// $this->performAjaxValidation($model);


		if(isset($_POST['Product']))

		{

			$model->attributes=$_POST['Product'];

			if($model->save())

				$this->redirect(array('view','id'=>$model->ProductID));

		}


		$this->render('update',array(

			'model'=>$model,

		));

	}

....

Untuk sekedar tambah data itu bisa, tapi untuk yg lainnya termasuk delete itu tidak berhasil. Untuk lebih jelasnya, silakan om bisa buktikan sendiri dengan generate ulang sebuah tabel dengan PK=varchar, analisa sy seperti ini om, sy coba di mysql dengan SQL Query




1. Jika integer-> maka SELECT * FROM `tbl_product` WHERE WHERE ProductID=1 (benar)

2. Jika varchar-> maka SELECT * FROM `tbl_product` WHERE ProductID='KMS' (benar)

3. Jika varchar-> maka SELECT * FROM `tbl_product` WHERE ProductID=KMS (salah karena tidak ada tanda kutip)


Di yii kasusnya sama seperti no.3, maka menjadi

WHERE ProductID=KMS (tanda petik tidak ada)

Prediksi sy tanda petik itu yg jadi masalah, karena jika sy coba di SQL Query maka tidak berhasil jika tidak ada tanda kutip. Gimana caranya menangani masalah itu? :blink:

Agak ribet kalau key nya varchar :

  1. rubah dulu di controllernya :



	public function loadModel($id)

	{


		$model=Item::model()->findByPk($id); // hapus int(), karena Pk kita adalah varchar <img src='http://www.yiiframework.com/forum/public/style_emoticons/default/smile.gif' class='bbc_emoticon' alt=':)' />

		if($model===null)

			throw new CHttpException(404,'The requested page does not exist.');

		return $model;

	}



  1. rubah di urlManagernya (config/main.php)



        'urlManager'=>array(

        	'urlFormat'=>'path',

        	'rules'=>array(

        		'post/<id:\d+>/<title:.*?>'=>'post/view',

        		'posts/<tag:.*?>'=>'post/index',

        		'<controller:\w+>/<action:\w+>'=>'<controller>/<action>',

        	),

        ),



diatas itu belom di rubah apapun urlManagernya, untuk lebih jelasnya baca tutorial untuk urlManager.

tapi ini harus disesuaikan dengan path url nya … :) kalo gak tetap aja ada yg bermasalah :)

semoga berhasil

oh… jadi masalahnya di situ… baru tahu

Setelah sy coba2 ternyata bisa, sy hanya hanya ubah jadi seperti ini (sama seperti cara pertama punya YiieRz)


	public function loadModel($id)

	{

		$model=Product::model()->findByPk($id);

		if($model===null)

			throw new CHttpException(404,'The requested page does not exist.');

		return $model;

	}



akhirnya berhasil juga tanpa harus seting urlManagernya.

terimakasih buat YiieR. Semoga ini bisa membantu yg lain juga.

Salam John

sebetulnya kalo pake cara no 1 sudah bisa sih gan jika tidak menggunakan simple Url.

tapi kalo pakai simple Url harus rubah urlManagernya juga.

setau saya sih ini belom ada cara yang efektif mengatasinya jika Pk = varchar.

mudah2an aja ver 2 nanti sudah gak ada masalah pk = varchar.

coba struktur tabelnya lihat dulu deh…

mungkin lebih jelas dalam meberikan soslusi…bagi teman-teman

Ok de sip

btw saya coba tadi di 117 gak bermasalah tanpa urlManager di rubah.

wew berarti ada peningkatan. Thanks YiiFw

Wah kasusnya sama persis yg sedang ane kerjakan Gan. Ane pake postgreSQl, PK nya character varying. cuma bisa input. Update cuma bisa yg berupa angka, padahal PK ane angka + huruf (123-g). Mohon pencerahannya Gan…ane dah coba cara 1 tetep lum bisa :

public function loadModel($id)

{


	&#036;model=PameranManca::model()-&gt;findByPk(&#036;id);


	if(&#036;model===null)


		throw new CHttpException(404,'The requested page does not exist.');


	return &#036;model;


}

Dan yang cara 2 bingung bagian urlManager yg mana yg dirubah :

‘urlManager’=>array(

		'urlFormat'=&gt;'path',


		'rules'=&gt;array(


			// REST patterns


	        array('api/list', 'pattern'=&gt;'api/&lt;model:&#092;w+&gt;', 'verb'=&gt;'GET'),


	        array('api/view', 'pattern'=&gt;'api/&lt;model:&#092;w+&gt;/&lt;id:&#092;d+&gt;', 'verb'=&gt;'GET'),


	        // array('api/update', 'pattern'=&gt;'api/&lt;model:&#092;w+&gt;/&lt;id:&#092;d+&gt;', 'verb'=&gt;'PUT'),


	        // array('api/delete', 'pattern'=&gt;'api/&lt;model:&#092;w+&gt;/&lt;id:&#092;d+&gt;', 'verb'=&gt;'DELETE'),


	        // array('api/create', 'pattern'=&gt;'api/&lt;model:&#092;w+&gt;', 'verb'=&gt;'POST'),





	        // Default Route


			'&lt;controller:&#092;w+&gt;/&lt;id:&#092;d+&gt;'=&gt;'&lt;controller&gt;/view',


			'&lt;controller:&#092;w+&gt;/&lt;action:&#092;w+&gt;/&lt;id:&#092;d+&gt;'=&gt;'&lt;controller&gt;/&lt;action&gt;',


			'&lt;controller:&#092;w+&gt;/&lt;action:&#092;w+&gt;'=&gt;'&lt;controller&gt;/&lt;action&gt;',


		),


	),

(lum baca turor urlManager)…hehe

Help