У меня есть эта функция для обновления записи, но я не могу ее завершить с ошибкой и отправить мне сообщение «Идентификатор первичного ключа отсутствует в строке или является нулевым», как я могу это исправить?
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;
}
}
Идиорм предполагает, что имя первичного ключа — «id», что не так, в вашем случае.
Поэтому вы должны явно указать это для Idiorm:
<?php
ORM::configure('id_column_overrides', array(
'dm_child' => 'id_child',
'other_table' => 'id_table',
));
Увидеть Документы> Конфигурация.
Я только что встретил эту проблему 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 () редактировать некоторые поля,
* но не первичный ключ, тогда первичный ключ недоступен для
* Обновление / удаление запроса — см. выпуск № 203.
* Нам нужно изменить первичный ключ здесь на что-то кроме id
* Потому что MockPDOStatement-> fetch () всегда возвращает идентификатор.
* /
Ответ, действительно, предоставлен @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
Я никогда не использовал 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();
Я уверен, что узнаю причину этого, но позвольте мне рассказать вам все, что я понимаю на данный момент, и как я это «исправил».
Вот начало функция сохранения идиорма:
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-> идентификатор, вы получаете исключение:
throw new Exception('Primary key ID missing from row or is null');
$ this- не содержит свойства id. Я не совсем уверен, как это могло. Пример, приведенный как на их домашней странице а также в документах не делает ничего особенного для решения этой проблемы. На самом деле я копирую их 1: 1 и все равно получаю ту же ошибку, что и вы.
Итак, все, что было сказано, я исправил эту ошибку, просто добавив свой собственный идентификатор:
$crop = ORM::for_table('SCS_Crop')->find_one($id);
$crop->id = $id;
$crop->Name = "Foo";
$crop->save();
Это также происходит, когда Я бы Имя поля неоднозначно, например, при соединении двух таблиц, имеющих столбец id. Это случай с ссылочными таблицами
Model::factory('tableOne')
->left_outer_join('tableTwo', array('tableOne.tableTwo_id', '=', 'tableTwo.id'))
->find_one($id);
В этих случаях установить псевдоним в столбец идентификатора родителя tableOne чтобы позже получить доступ к нему при сохранении. Убедитесь, что вы также выбрали другие столбцы, которые вам нужны — например, с помощью -> выберите (‘*’):
Model::factory('tableOne')
->select('*')
->select('tableOne.id', 'id')
->left_outer_join('tableTwo', array('tableOne.tableTwo_id', '=', 'tableTwo.id'))
->find_one($id);