使用idiorm和php更新一行

时间:2015-01-12 22:36:27

标签: php mysql idiorm

我有这个功能来更新记录,但我不能失败并向我发送“行中缺少主键ID或为空”的消息,我该如何解决?

public static function update_child($data)
{
    try
    {
        $update= ORM::for_table("dm_child",DM_TAG)
                        ->where_equal($data["id_child"]);

        $update -> set(array(
            "gender" => $data["gender"]
            "age_year" =>$data["year"]
            "age_month" => $data["month"]

        ));
        $update -> save();
    }
    catch(PDOException $ex)
    {
        ORM::get_db()->rollBack();
        throw $ex;
    }
}

6 个答案:

答案 0 :(得分:4)

Idiorm假设主键的名称是' id',在您的情况下不是这样。 因此,您必须将其明确指定给Idiorm:

<?php
    ORM::configure('id_column_overrides', array(
    'dm_child' => 'id_child',
    'other_table' => 'id_table',
));

请参阅Docs>Configuration

答案 1 :(得分:1)

我刚刚在2分钟前遇到过这个问题。真正的原因是,你在查询中忘记了选择id字段。 演示:

$demo = ORM::for_table('demo')->select('field_test')->find_one($id);
$demo->field_test = 'do';
$demo->save();

您将收到错误消息。 改为:

$demo = ORM::for_table('demo')->select('field_test')->select('id')->find_one($id);

它将解决问题。

文档中的一些提示: https://github.com/j4mie/idiorm/blob/master/test/ORMTest.php

/ **      *需要接下来的两个测试,因为如果你有select()ed某些字段,      *但不是主键,那么主键不可用      *更新/删除查询 - 请参阅问题#203。      *我们需要将主键更改为id以外的其他键      *因为MockPDOStatement-&gt; fetch()总是返回一个id。      * /

答案 2 :(得分:1)

答案确实是@iNpwd为每个表更改查询的默认“id”列名所提供的答案:

ORM::configure('id_column_overrides', array(
    'table_name'  => 'column_name_used_as_id',
    'other_table' => array('pk_1', 'pk_2') // a compound primary key
));

在让我识别我的查询时咬我的事是我在哪里更改ORM::configure值。我的文件不正确。

特别是ID列配置的更深层链接:http://idiorm.readthedocs.org/en/latest/configuration.html#id-column

答案 3 :(得分:0)

我从来没有使用idiorm,所以不能保证我的答案对你有用,但是从这个page和&#34;更新记录&#34;,我们有一个类似的例子但与你的情况略有不同。

// The 5 means the value of 5 in the primary-key column
$person = ORM::for_table('person')->find_one(5);

// The following two forms are equivalent
$person->set('name', 'Bob Smith');
$person->age = 20;

// This is equivalent to the above two assignments
$person->set(array(
    'name' => 'Bob Smith',
    'age'  => 20
));

// Syncronise the object with the database
$person->save();

答案 4 :(得分:0)

我相信我会了解这背后的原因,但是让我告诉你我现在理解的一切,以及我如何“修复”它。

以下是idiorm's save function的开头:

public function save() {
    $query = array();
    // remove any expression fields as they are already baked into the query
    $values = array_values(array_diff_key($this->_dirty_fields, $this->_expr_fields));
    if (!$this->_is_new) { // UPDATE
        // If there are no dirty values, do nothing
        if (empty($values) && empty($this->_expr_fields)) {
            return true;
        }
        $query = $this->_build_update();
        $id = $this->id(true);

就在那里,在最后一行,当尝试访问 $ this-&gt; id 时,您将收到异常抛出:

throw new Exception('Primary key ID missing from row or is null');

$ this 不包含id属性。我不确定它怎么可能。同时给出on their homepagein the docs的示例并没有做任何特别的事情来解决这个问题。事实上,我正在以1:1的比例复制它们,但仍然会产生与你相同的错误。

所以,所有这一切,我通过添加我自己的id修复了这个错误:

$crop = ORM::for_table('SCS_Crop')->find_one($id);
$crop->id = $id;
$crop->Name = "Foo";
$crop->save();

答案 5 :(得分:0)

id 字段名称不明确时,也会发生这种情况,例如:当连接两个都有id列的表时。引用表格就是这种情况

Model::factory('tableOne')
->left_outer_join('tableTwo', array('tableOne.tableTwo_id', '=', 'tableTwo.id'))
->find_one($id);

在这些情况下,将别名设置为父 tableOne 的ID列,以便稍后在保存时访问它。确保您还选择了所需的其他列 - 例如by - &gt; select(&#39; *&#39;):

Model::factory('tableOne')
->select('*')
->select('tableOne.id', 'id')
->left_outer_join('tableTwo', array('tableOne.tableTwo_id', '=', 'tableTwo.id'))
->find_one($id);