3

我有这个功能来更新记录,但我不能它失败并向我发送“行中缺少主键 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;
    }
}
4

7 回答 7

4

Idiorm 假定主键的名称是“id”,在您的情况下不是这样。因此,您必须将其显式指定为 Idiorm:

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

请参阅文档>配置

于 2015-03-31T01:01:04.930 回答
2

答案确实是@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

于 2015-11-13T15:37:11.007 回答
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

/** * 需要接下来的两个测试,因为如果您选择()了一些字段,* 但不是主键,那么主键对于更新/删除查询不可用 - 请参阅问题 #203。* 我们需要将这里的主键更改为id * 因为 MockPDOStatement->fetch() 总是返回一个 id。*/

于 2015-04-07T16:10:52.327 回答
0

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

这是idiorm 的保存功能的开始:

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->id时,你会抛出一个异常:

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

$this不包含 id 属性。我不确定它是怎么做到的。在他们的主页文档中给出的例子并没有做任何特别的事情来解决这个问题。事实上,我正在 1:1 复制它们,但仍然产生与您相同的错误。

所以,说了这么多,我通过添加我自己的 id 来修复这个错误:

$crop = ORM::for_table('SCS_Crop')->find_one($id);
$crop->id = $id;
$crop->Name = "Foo";
$crop->save();
于 2015-04-09T17:48:24.830 回答
0

我从来没有使用过 idiorm,所以不能保证我的答案对你有用,但是从这个页面和“更新记录”下,我们有一个与你的相似但略有不同的例子。

// 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();
于 2015-01-12T22:52:44.630 回答
0

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

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

在这些情况下,为父tableOne的 ID 列设置一个别名,以便以后在保存时访问它。确保您还选择了您需要的其他列 - 例如通过 ->select('*'):

Model::factory('tableOne')
->select('*')
->select('tableOne.id', 'id')
->left_outer_join('tableTwo', array('tableOne.tableTwo_id', '=', 'tableTwo.id'))
->find_one($id);
于 2016-03-09T19:56:08.560 回答
0

如果表中的主键/字段名不是 id,则后面的 id 列会覆盖所需的默认 id (primary_key) 以替换为其他 id 名称 (primary_key)

    ORM::configure('id_column_overrides', array(
        'user'  => 'user_id',
    ));

    $update = ORM::for_table('user')->find_one(1);
    $update->name = "dev";
    try{
        $update->save();
    }catch(Exception $e){
        echo $e;
    }

    print_r($update);
于 2022-02-25T07:58:19.447 回答