mysql — обновляет строку, используя idiorm и переполнение стека

У меня есть эта функция для обновления записи, но я не могу ее завершить с ошибкой и отправить мне сообщение «Идентификатор первичного ключа отсутствует в строке или является нулевым», как я могу это исправить?

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;
}
}

3

Решение

Идиорм предполагает, что имя первичного ключа — «id», что не так, в вашем случае.
Поэтому вы должны явно указать это для Idiorm:

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

Увидеть Документы> Конфигурация.

4

Другие решения

Я только что встретил эту проблему 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 () всегда возвращает идентификатор.
* /

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

1

Я никогда не использовал 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();
0

Я уверен, что узнаю причину этого, но позвольте мне рассказать вам все, что я понимаю на данный момент, и как я это «исправил».

Вот начало функция сохранения идиорма:

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();
0

Это также происходит, когда Я бы Имя поля неоднозначно, например, при соединении двух таблиц, имеющих столбец 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);
0
По вопросам рекламы [email protected]