PDA

View Full Version : روش مناسب برای درج یا اصلاح در جداول مرتبط



googoli
جمعه 14 فروردین 1394, 13:01 عصر
سلام
من دنبال یه روش مناسب برای ذخیره سازی و یا اصلاح اطلاعات در جدول های مرتبط با جدول اصلی هستم
بعنوان مثال در فروشگاه اینترنتی یک جدول داریم به نام خصوصیات
من می خوام جدول محصول و خصوصیات در یک فرم نمایش داده بشه
با روش نمایش و ارسال و ... مشکل ندارم
فقط بحث من اینجاست که هنگام ذخیره سازی باید دستی به جدول خصوصیات رکورد اضافه کنم و یا اینکه دونه به دونه چک کنم که ایا این یک رکورد تغییر کرده و اگر تغییر کرده من هم تغییرش بدم یا نه خود فریم ورک این کار را انام میده ؟

googoli
جمعه 14 فروردین 1394, 22:54 عصر
خب بذارید من روشی که دارم استفاده می کنم رو میذارم و بعد رو این روش بحث کنیم و دوستان روش های پیشنهادی خودشون رو بگن
من به این صورت عمل کردم


$property= new property ;
if(isset($_POST['property']))
{

$count = count($_POST['property']['title']);
for($i=0;$i<$count;$i++){
$property->attributes = $this->postConvert($_POST['property'],$i) ;
if($property->validate())
{

$property->isNewRecord = false;
if($property->save())
echo 'ok';
}
}
}



protected function postConvert($param=array(),$i)
{
$attributes = array();
foreach ($param as $key=>$value)
$attributes[$key] = $param[$key][$i];
return $attributes ;
}

خب این روش من هست فقط یه مشکل دارم
زمانی که می خوام attributes رو اختصاص بدم همه attributes اختصاص پیدا می کنن به غیر از id مشکل کجاست

MMSHFE
جمعه 14 فروردین 1394, 23:36 عصر
id معمولاً auto increment درنظر گرفته میشه و خودش شماره میخوره. شما نباید مقدار بدین. توی آپدیت هم که خودش از قبل مقدار داره.

googoli
شنبه 15 فروردین 1394, 08:23 صبح
خب استاد چاره کار چیست ؟من الان اومدم بصورت دستی ایدی رو مقدار دهی کردم

درباره روشی که استفاده می کنم نظر ندادید ایا روش درستی است ؟

MMSHFE
شنبه 15 فروردین 1394, 08:28 صبح
شما نیاز نیست چیزی رو چک کنید. اگه چیزی تغییر نکرده باشه، save مقدار false برمیگردونه.

googoli
شنبه 15 فروردین 1394, 08:34 صبح
ولی وقتی ایدی ست نشه برای من مقدار true برمی گرداند
و اگر ایدی رو مقدرا دهی کنم


$property->attributes = $attribute ;
$property->id = $attribute['id'] ;

ولی بعد از سیو شدن مقدار ابدیت می شود ولی با پیغام خطای زیر هم نمایش داده می شود


CDbCommand failed to execute the SQL statement: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '3' for key 'PRIMARY'. The SQL statement executed was: UPDATE `tbl_product_discount` SET `count`=:yp0, `price`=:yp1, `featured`=:yp2, `confirm`=:yp3, `product_id`=:yp4, `coustomer_group`=:yp5, `publish_up`=:yp6, `publish_down`=:yp7, `id`=:yp8 WHERE `tbl_product_discount`.`id`=1

MMSHFE
شنبه 15 فروردین 1394, 09:01 صبح
کلید اصلی جدولتون چیه؟ توی تنظیمات دیتابیس، enableParamLogging رو هم true کنید تا پارامترهای ارسال شده رو بتونیم ببینیم.

googoli
شنبه 15 فروردین 1394, 10:09 صبح
کلید اصلی جدول id هست
کاری که شما گفتید رو انجام دادم و این هم نتیجه اش


CDbCommand failed to execute the SQL statement: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '3' for key 'PRIMARY'. The SQL statement executed was: UPDATE `tbl_product_discount` SET `count`=:yp0, `price`=:yp1, `featured`=:yp2, `confirm`=:yp3, `coustomer_group`=:yp4, `product_id`=:yp5, `id`=:yp6 WHERE `tbl_product_discount`.`id`=1. Bound with :yp0='1', :yp1='313', :yp2=0, :yp3=0, :yp4=3, :yp5=1, :yp6=3

من خودم چک کردم داره اشتباه جایگذاری می کنه
من id یک رو بروزرسانی کردم نمی دونم چرا مقدار id رو برابر 3 قرار میده

ارایه تولیدی من


Array
(
[coustomer_group] => 1
[count] => 22
[price] => 12000
[featured] => 1
[id] => 1
[product_id] => 1
)

$model->attra = Array
(
[count] => 22
[price] => 12000
[featured] => 1
[confirm] => 0
[coustomer_group] => 1
[product_id] => 1
[id] => 1
[publish_up] =>
[publish_down] =>
)

Array
(
[coustomer_group] => 3
[count] => 1
[price] => 313
[featured] => 0
[id] => 3
[product_id] => 1
)

$model->attra = Array
(
[count] => 1
[price] => 313
[featured] => 0
[confirm] => 0
[coustomer_group] => 3
[product_id] => 1
[id] => 3
[publish_up] =>
[publish_down] =>
)

MMSHFE
شنبه 15 فروردین 1394, 10:33 صبح
یه جای کار توی کدتون اشکال داره. شما دارین فیلد id رکورد اصلی رو با فیلد id توی model->attra$ مقداردهی میکنید.

googoli
شنبه 15 فروردین 1394, 10:46 صبح
نه فکر کنم شما اشتباه متوجه شدید
این کد من هست کلش رو میذارم ببینید


public function actionUpdate($id,$return = null)
{
$model=$this->loadModel($id);
//find discount record
$discount = new ProductDiscount;
$data = $discount->with(array('product'=>array('condition'=>'product_id='.$id)))->findAll();
$this->performAjaxValidation($model);

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

if(isset($_POST['Product']))
{
$model->attributes=$_POST['Product'];
if(isset($_POST['discount']))
{
$count = count($_POST['discount']['coustomer_group']);
for($i=0;$i<$count;$i++){
echo '<pre>'.print_r($this->postConvert($_POST['discount'],$i),true).'</pre><br>';
$attribute = $this->postConvert($_POST['discount'],$i) ;
$discount->attributes = $attribute ;
$discount->id = $attribute['id'] ;
echo '<pre>$model->attra = '.print_r($discount->attributes,true).'</pre><br>';
if($discount->validate())
{
print_r($discount->attributes);
$discount->isNewRecord = false;
if($discount->save())
echo 'ok<br>';
}
else {
$error = new CException(CHtml::errorSummary($discount));
$model->addError('ll', $error->getMessage());
}
}
exit;
}
if($model->save())
$this->redirect(array('view','id'=>$model->id));
}

$this->render('update',array(
'model'=>$model,
'data'=>$data,
'discount'=>$discount
));
}

protected function postConvert($param=array(),$i)
{
$attributes = array();
foreach ($param as $key=>$value)
$attributes[$key] = $param[$key][$i];
return $attributes ;
}

MMSHFE
شنبه 15 فروردین 1394, 10:57 صبح
داخل حلقه for باید مدل جدید از discount بسازین. وقتی همون اول فقط دارین میسازین، توی حلقه مدام داره update میکنه چون شئ جدید نساختین.

googoli
شنبه 15 فروردین 1394, 18:01 عصر
یه سوال که ربطی به موضوع تاپیک نداره
من الان می خواستم با جی کوئری یک سطر به جدولم اضافه کنم و برای این کار کد زیر رو نوشتم


Yii::app()->clientScript->registerScript('addrow', "
$('#addrow').click(function(){
html = '<tr>' ;
html += '<td >".CHtml::textField('discount[count][]',$value['count'],array('class'=>'form-control'))."</td>';
html += '<td >".CHtml::textField('discount[price][]',$value['price'],array('class'=>'form-control'))."</td>';
html += '<td >".CHtml::dropDownList('discount[featured][]',$value['featured'],$yn,array('class'=>'form-control'))."</td>';
html += '</tr>' ;
$('#discount-table tr:last').append(html);

});
");

وقتی که کد dropDownList رو میذارم دیگه کد کار نمیکنه ؟
چرا؟و باید چکارکنم ؟

MMSHFE
سه شنبه 18 فروردین 1394, 09:58 صبح
به نظرم میاد کدتون استاندارد نیست یه جورایی خطای JS داره انگار. منظورم باز و بسته شدن کوتیشنهاست. این کد رو تست کنید:

$countField = CHtml::textField('discount[count][]', $value['count'], array('class'=>'form-control'));
$priceField = CHtml::textField('discount[price][]', $value['price'], array('class'=>'form-control'));
$featuredField = CHtml::dropDownList('discount[featured][]', $value['featured'], $yn, array('class'=>'form-control'));
Yii::app()->clientScript->registerScript('addrow', '
$("#addrow").click(function() {
var html = "<tr>";
html += "<td>' . $countField . '</td>";
html += "<td>' . $priceField . '</td>";
html += "<td>' . $featuredField . '</td>";
html += "</tr>";
$("#discount-table tr:last").append(html);
});
');

MMSHFE
سه شنبه 18 فروردین 1394, 09:59 صبح
اگه جواب نداد، کدتون رو با Firebug چک کنید ببینید موقع اجرا چه خطایی توی سربرگ Console میگیرین.