Czy ktoś wie, jak dodać wiele rekordów za pomocą tylko jednego formularza w Yii? Wszystkie rekordy należą do tego samego modelu i mają ten sam format.Yii - wiele rekordów w jednym formularzu składania
Dziękujemy,
Nick
Czy ktoś wie, jak dodać wiele rekordów za pomocą tylko jednego formularza w Yii? Wszystkie rekordy należą do tego samego modelu i mają ten sam format.Yii - wiele rekordów w jednym formularzu składania
Dziękujemy,
Nick
Odpowiednikiem "batchCreate" Sposób "batchUpdate" from the guide może być coś takiego:
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));
}
Jedynym problemem jest to, że nowa instancja ma do utworzenia dla każdego modelu, który zapisujesz, używając new
. Resztę logiki można zaimplementować w dowolny sposób, na przykład w powyższym przykładzie wszystkie modele są sprawdzane, a następnie zapisywane, podczas gdy można zatrzymać sprawdzanie poprawności, jeśli którykolwiek model był nieprawidłowy, lub może bezpośrednio zapisać modele, dopuszczenie do sprawdzania poprawności podczas połączenia save
. Tak więc logika naprawdę zależy od kodu ux twojej aplikacji.
Dziękuję za to i przepraszam za opóźnioną odpowiedź. To pomogło. – goose
Umieść ten kod w folderze components
pod nazwą pliku GeneralRepository.php
.
<?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);
}
}
i użytkowania w dowolnym miejscu:
$rows = array(
array('id' => 1, 'name' => 'John'),
array('id' => 2, 'name' => 'Mark')
);
GeneralRepository::insertSeveral(User::model()->tableName(), $rows);
To tylko wykonać jedno zapytanie.
http://www.yiiframework.com/doc/guide/1.1/en/form.table – dInGd0nG
Dzięki! właśnie tego szukałem. – goose
Czy ktoś jest w stanie potwierdzić składnię równoważnej metody batchCreate? Tego nie ma na stronie powiązanej powyżej. – goose