Как вставить более одной записи в базу данных с помощью Kohana ORM? - PullRequest
0 голосов
/ 16 сентября 2011

Я использую Kohana 3.0, и моя задача - вставить данные в базу данных.Проблема в том, что мне нужно вставить более одной записи (так что ... в сыром SQL - более одного запроса).У меня есть поля project_id, amount и financiers (это массив), который приходит от $_POST.

В контроллере у меня есть что-то вроде этого:

$model_for_financiers->values($_POST);

$model_for_financiers->save_many();

Я создал метод с именем save_many() в моей модели ORM.

public function save_many() {

    foreach ($this->financiers as $financier_id) {

        $this->created_at = time();
        $this->amount     = $this->amount * 100;

        $this->financier_id = $financier_id;

        $this->save();

        $this->reset();

    }

}

... и добавил financiers в качестве игнорируемого столбца.

Есть два нежелательных поведения (или как я долженназывать их?) в моем коде:

  1. В базу данных вставляется только последняя запись (не имеет значения, сколько идентификаторов в financiers),

  2. amount умножается столько раз, сколько идентификаторов в financiers.Например, если в этом массиве два идентификатора ... он будет умножен на 100 ' 00 (последние два нуля нежелательны).

Можете ли выпомогите мне с этим, ребята?Спасибо за совет.

Редактировать:

Вот моя вторая идея.Короче говоря, цикл в контроллере и каждый раз - новый экземпляр объекта.

Контроллер:

foreach ($_POST['financiers'] as $financier_id) {

    $model_for_financiers = ORM::factory('Vcn_Project_Financier');

    $model_for_financiers->values(array(
        'amount'       => $_POST['amount'],
        'project_id'   => $project_id,
        'financier_id' => $financier_id
    ));

    if ($model_for_financiers->check()) {

        $model_for_financiers->save();

    }

}

Модель:

public function save() {

    $this->created_at = time();
    $this->amount     = $this->amount * 100;

//      $this->reset();

    parent::save();

}

Я действительно неЯ знаю, что за хрень, но в модели save(), когда я пытаюсь var_dump() любой переменной, которую я передал values(), он говорит NULL.Хорошей новостью является то, что теперь он вставляет правильное количество записей в базу данных.Плохая новость: все данные, переданные на values(), пусты.

Помощь здесь очень важна.:)

Редактировать # 2:

3-е решение, которое не работает.: (

Контроллер:

$model_for_financiers = ORM::factory('Vcn_Project_Financier');

$model_for_financiers->save_many($_POST['amount'], $_POST['financiers'], $project_id);

Модель:

public function save_many($amount, $financiers, $project_id) {

    foreach ($financiers as $financier_id) {

        $this->values(array(
            'amount'       => $amount,
            'financier_id' => $financier_id,
            'project_id'   => $project_id
        ));

        if ($this->check()) {

            $this->created_at = time();
            $this->amount     = $amount * 100;

            $this->save();

        }

        $this->reset();

    }

}

Вставляет только одну запись и игнорирует все, что было передано values() как в решении #2.

Что происходит?

Ответы [ 2 ]

2 голосов
/ 16 сентября 2011

Модель представляет только один ряд данных, и весь ORM построен на этой концепции. Если вы хотите сохранить несколько результатов, вам придется создавать экземпляры каждого нового объекта внутри метода, который вы используете для него, а не использовать $ this (он создаст строку только один раз и обновит ее на каждой другой итерации, потому что вы используете save()).

Итак:

foreach ($whatevers as $data)
{
    $row = new Model_Whatever;

    $row->values($data)->create();
}

И вам следует попробовать быть строгим и использовать ORM::create() и ORM::update() вместо сохранения (вы, вероятно, отладите его сразу же, если бы сделали это раньше :)).

Редактировать: упс, извините, я упустил из виду тот факт, что вы используете Kohana 3.0, поэтому нет разделения update() и create() :)

0 голосов
/ 06 октября 2011

Я нашел способ добавить несколько записей, просто вызвав один метод в классе ORM.Никаких петель в контроллере или что-то в этом роде ... :)

/**
 * Tries to save multiple entries into the database. If there are problems
 * with validation, method won't save current entry in the database (entries
 * before will be saved) and will stop itself by returning `false`.
 *
 * @param  array   Data (for example, `$_POST`)
 * @return boolean Success?
 */
function try_to_save_many($data) {

    foreach ($data['people'] as $person_id) {

        $this->clear();

        $this->member_id  = $person_id;
        $this->project_id = $data['project_id'];

        if ($this->check()) {

            $this->save();

        } else {

            return false;

        }

    }

    return true;

}

PS Возможно, это не правильный путь, и ORM не предназначен для подобных вещей, но мне нужно было это сделать.Просто сделай это.: D

...