0

我正在使用 Kohana 3.0,我的任务是在数据库中插入数据。问题是我需要在其中插入一个以上的条目(所以......在原始 SQL 中 - 不止一个查询)。我有 fields project_idamount并且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. 只有最后一个条目被插入到数据库中(不管有多少个 ID financiers),

  2. amount乘以 ID 的倍数financiers。例如,如果该数组中有两个 ID……它将乘以 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:

第三个解决方案不起作用。:(

控制器:

$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 中一样。

怎么了?

4

2 回答 2

2

一个模型只代表一行数据,整个 ORM 都是围绕这个概念构建的。如果要保存多个结果,则必须在用于它的方法中实例化每个新对象,而不是使用 $this (它只会创建一次行并在每个其他迭代中更新它,因为您'正在使用save())。

所以:

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

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

而且您应该尝试严格并使用ORM::create()andORM::update()而不是 save (如果您之前这样做,您可能会立即调试它:))。

编辑:哎呀,对不起,我忽略了你正在使用 Kohana 3.0 的事实,所以没有update()create()分离:)

于 2011-09-16T16:08:34.710 回答
0

I found a way how to add multiple entries just by calling one method in ORM class. No loops in controller or whatever... :)

/**
 * 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;

}

P.S. Maybe it's not the correct way and ORM is not designed for stuff like that, but I needed to do it. Just do it. :D

于 2011-10-06T16:00:13.297 回答