einfache afterSave-Methode funktioniert nicht in Yii
Möchte ich ein Feld aktualisieren, die in eingefügt raw afterSave
Methode,so entwickle ich folgenden code im Treiber-Modell
protected function afterSave() {
parent::afterSave();
if ($this->isNewRecord) {
$newid = self::newid($this->id);
$this->updateByPk($this->id, new CDbCriteria(array('condition'=>'driverid = :driverid', 'params'=>array('driverid'=> $newid))));
}
}
und im Controller die Methode, die crud aus:
public function actionCreate()
{
$model=new Driver;
//Uncomment the following line if AJAX validation is needed
//$this->performAjaxValidation($model);
if(isset($_POST['Driver']))
{
$model->attributes=$_POST['Driver'];
if($model->save())
$this->redirect(array('view','id'=>$model->id));
}
$this->render('create',array(
'model'=>$model,
));
}
, warum nach dem speichern nicht funktioniert?
edit:
private static function CheckNumber($number) {
$array = array(10);
for ($i = 0; $i < 10; $i++)
$array[$i] = 0;
do {
$array[$number % 10]++;
$number /= 10;
} while ((int) ($number / 10 ) != 0);
$array[$number]++;
for ($i = 0; $i < 10; $i++)
if ($array[$i] > 1)
return false;
return true;
}
public static function newid($id) {
while (self::CheckNumber($id) == FALSE) {
$id++;
}
return $id;
}
Bitte zeigen Sie selbst::newid-Methode
InformationsquelleAutor Moein Hosseini | 2012-08-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre updateByPk versaut ist..
Dokumentation
Als nicht klar ist, was Sie tun möchten..Also ich bin davon ausgegangen, das Sie aktualisieren möchten driver_id Wert durch das Ergebnis der
self::newid($this->id);
des gerade eingefügten Zeile..was Sie tun sollten, ist:
Und ja, Sie haben Recht über die Nutzung der
afterSave()
Von Yii Forum sagte Qiang Selbst..
dann nutzen Sie
save()
..aktualisiert d AntwortIch Teste es an, bekam folgenden Fehler: CDbCommand konnte nicht die SQL-Anweisung ausführen: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '345' für Schlüssel 'PRIMARY'. Die SQL-Anweisung ausgeführt wurde:
INSERT INTO
driver
(name
,fathername
,nationalcode
,birthdaycity
,birthday
,education
,cellphone
,group
,dltype
,workid
,company
,worklocation
,bustype
,experienceyear
,practical_class_day_time
,practical_class_enter_time
,practical_class_exit_time
,certificatetime
,computerskill
,gameskill
,score1
,score2
,score3
,scoretype
,address
,phone
,imgadd
,id
,driverid
) WERTE (:yp0, :yp1, :yp2, :yp3, :yp4, :yp5, :yp6, :yp7, :yp8, :yp9, :yp10, :yp11, :yp12, :yp13, :yp14, :yp15, :yp16, :yp17, :yp18, :yp19, :yp20, :yp21, :yp22,versuchen Sie nun,..Inspiriert von yiiframework.com/forum/index.php/topic/...
InformationsquelleAutor Rajat Singhal
Als zu Recht hingewiesen hat, Rajat, Ihre
updateByPk();
ist falsch. Sie können stattdessen diese Zeile zu aktualisieren, diedriverid
Feld der neu erstellten Datensatz:So, Ihre gesamte
afterSave()
wird dies:saveAttributes()
letztendlich ruftupdateByPk()
.InformationsquelleAutor bool.dev
Der insert-Methode in "CActiveRecord" setzt die "isNewRecord" - Eigenschaft als "false", wenn das einfügen erfolgreich abgeschlossen ist.
Daher das "if ($this->isNewRecord)" Zustand in Ihrem afterSave-Methode immer false und das Programm wird nie ausgeführt werden, die updateByPk Methode in diesem Zustand. Das ist, warum Ihr afterSave wird nicht funktionieren.
InformationsquelleAutor yaser
InformationsquelleAutor Mani