2012-10-27 24 views
5

Yii'de yalnızca bir form kullanarak birden çok kayıt nasıl ekleyeceğinizi bilen var mı? Tüm kayıtlar aynı modele ait ve aynı formatta.Yii - bir form gönderiminde birden çok kayıt

Çok teşekkürler,

Nick

+2

http://www.yiiframework.com/doc/guide/1.1/en/form.table – dInGd0nG

+0

Teşekkürler! Tam da aradığım şey. – goose

+0

Herkes, eşdeğer batchCreate yönteminin sözdizimini doğrulayabilir mi? Bu, yukarıdaki sayfadan eksik. – goose

cevap

9

"batchUpdate" from the guide eşdeğer "batchCreate" yöntemi böyle bir şey olabilir:

yeni bir örneğini sahiptir
public function actionBatchCreate() { 
    $models=array(); 
    // since you know how many models 
    $i=0; 
    while($i<5) { 
     $models[]=Modelname::model(); 
     // you can also allocate memory for the model with `new Modelname` instead 
     // of assigning the static model 
    } 
    if (isset($_POST['Modelname'])) { 
     $valid=true; 
     foreach ($_POST['Modelname'] as $j=>$model) { 
      if (isset($_POST['Modelname'][$j])) { 
       $models[$j]=new Modelname; // if you had static model only 
       $models[$j]->attributes=$model; 
       $valid=$models[$j]->validate() && $valid; 
      } 
     } 
     if ($valid) { 
      $i=0; 
      while (isset($models[$i])) { 
       $models[$i++]->save(false);// models have already been validated 
      } 
      // anything else that you want to do, for example a redirect to admin page 
      $this->redirect(array('modelname/admin')); 
     } 
    } 

    $this->render('batch-create-form',array('models'=>$models)); 
} 

Buradaki tek endişe olduğunu new kullanarak, kaydettiğiniz her model için oluşturulacak. Mantığın geri kalanı herhangi bir şekilde uygulanabilir, örneğin yukarıdaki örnekte tüm modeller onaylanır ve sonra kaydedilir, oysa herhangi bir model geçersizse veya modelleri doğrudan kaydedebilirseniz doğrulama işlemini durdurabilirsiniz. doğrulama, save araması sırasında gerçekleşir. Yani mantık gerçekten uygulamanızın ux'ine bağlı olacaktır.

+1

Bunun için teşekkürler ve geç cevap için özür dilerim. Bu yardımcı oldu. – goose

0

Bu kodu GeneralRepository.php dosya adının altındaki components klasörüne koyun. her yerde

<?php 
class GeneralRepository 
{ 
    /** 
    * Creates and executes an INSERT SQL statement for several rows. 
    * 
    * Usage: 
    * $rows = array(
    *  array('id' => 1, 'name' => 'John'), 
    *  array('id' => 2, 'name' => 'Mark') 
    *); 
    * GeneralRepository::insertSeveral(User::model()->tableName(), $rows); 
    * 
    * @param string $table the table that new rows will be inserted into. 
    * @param array $array_columns the array of column datas array(array(name=>value,...),...) to be inserted into the table. 
    * @return integer number of rows affected by the execution. 
    */ 
    public static function insertSeveral($table, $array_columns) 
    { 
     $connection = Yii::app()->db; 
     $sql = ''; 
     $params = array(); 
     $i = 0; 
     foreach ($array_columns as $columns) { 
      $names = array(); 
      $placeholders = array(); 
      foreach ($columns as $name => $value) { 
       if (!$i) { 
        $names[] = $connection->quoteColumnName($name); 
       } 
       if ($value instanceof CDbExpression) { 
        $placeholders[] = $value->expression; 
        foreach ($value->params as $n => $v) 
         $params[$n] = $v; 
       } else { 
        $placeholders[] = ':' . $name . $i; 
        $params[':' . $name . $i] = $value; 
       } 
      } 
      if (!$i) { 
       $sql = 'INSERT INTO ' . $connection->quoteTableName($table) 
       . ' (' . implode(', ', $names) . ') VALUES (' 
       . implode(', ', $placeholders) . ')'; 
      } else { 
       $sql .= ',(' . implode(', ', $placeholders) . ')'; 
      } 
      $i++; 
     } 
     $command = Yii::app()->db->createCommand($sql); 
     return $command->execute($params); 
    } 
} 

Ve kullanımı:

$rows = array(
    array('id' => 1, 'name' => 'John'), 
    array('id' => 2, 'name' => 'Mark') 
); 
GeneralRepository::insertSeveral(User::model()->tableName(), $rows); 

Bu sadece bir sorguyu yürütmek.

İlgili konular