我有这个功能来更新记录,但我不能失败并向我发送“行中缺少主键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;
}
}
答案 0 :(得分:4)
Idiorm假设主键的名称是' id',在您的情况下不是这样。 因此,您必须将其明确指定给Idiorm:
<?php
ORM::configure('id_column_overrides', array(
'dm_child' => 'id_child',
'other_table' => 'id_table',
));
答案 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 homepage和in 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);