неожиданное поведение newObject
Пишу в раздел вопросы, т.к. в раздел «для разработчиков» рейтинг недостаточен
Потратив некоторое время на поиск бага, решил поделить с сообществом. Может кому то время сэкономит.
такое не работает
Причина
Возможность передать $setPrimaryKeys=true из newObject отсутствует
Сообщений об ошибке нет.
ps. Такое тоже не работает
pps.
github.com/bezumkin/Tickets/blob/32b75aad0f7bbf7407efd4fe8206c1e0e767eb6e/core/components/tickets/model/tickets/ticket.class.php#L664-L667
ppps. Для таблиц а-ля client_properties удобно юзать id совпадающий с client
Интересует мнение, в целом нормальная практика задавать id или лучше такого избегать?
Потратив некоторое время на поиск бага, решил поделить с сообществом. Может кому то время сэкономит.
такое не работает
$xpdo->newObject($className, array('id' => $id);
а такое работает$obj = $xpdo->newObject($className);
$obj->id = $id;
class xPDOObject {
...................................
public function fromArray($fldarray, $keyPrefix= '', $setPrimaryKeys= false, $rawValues= false, $adhocValues= false) {
...................................
$key = $this->getField($key);
if (isset ($this->_fieldMeta[$key]['index']) && $this->_fieldMeta[$key]['index'] == 'pk') {
if ($setPrimaryKeys) {
if (isset ($this->_fieldMeta[$key]['generated'])) {
$generatedKey= true;
}
if ($this->_new) {
if ($rawValues || $generatedKey) {
$this->_setRaw($key, $val);
} else {
$this->set($key, $val);
}
$pkSet= true;
}
}
}
Поэтому если в массиве есть ключ совпадающий с pk, то он игнорируется.Возможность передать $setPrimaryKeys=true из newObject отсутствует
Сообщений об ошибке нет.
ps. Такое тоже не работает
$obj = $xpdo->newObject($className, $id);
Сообщений об ошибке нет.pps.
github.com/bezumkin/Tickets/blob/32b75aad0f7bbf7407efd4fe8206c1e0e767eb6e/core/components/tickets/model/tickets/ticket.class.php#L664-L667
ppps. Для таблиц а-ля client_properties удобно юзать id совпадающий с client
Интересует мнение, в целом нормальная практика задавать id или лучше такого избегать?
Комментарии: 8
Поле id генерируется автоматически, причем на уровне базы данных, я думаю.
Задавать нельзя, как вы проблему совпадающих id решать хотите?
Задавать нельзя, как вы проблему совпадающих id решать хотите?
Вообще-то, можно.
Именно так msProductData привязывается к msProduct — у них всегда одинаковые id. А по ссылке на Tickets была опечатка, я её уже поправил.
$obj = $modx->newObject('xPDOObject');
// после создания нового объекта можно выставлять любое поле
$modx->set('id', 10);
// или
$modx->fromArray(['id' => 10], '', true); // 3й параметр позволяет менять первичный ключ
Именно так msProductData привязывается к msProduct — у них всегда одинаковые id. А по ссылке на Tickets была опечатка, я её уже поправил.
у меня этот кусок использовался при импорте из 1с
поле id = id в 1с
при таком раскладе «проблемы совпадающих id» просто не могло возникнуть от слова совсем.
поле id = id в 1с
при таком раскладе «проблемы совпадающих id» просто не могло возникнуть от слова совсем.
- артикул
- TV-поле
- расширить modResource или msProduct, добавив своё поле. Я использую extID.
При импорте можно использовать варианты:
У меня свои таблицы.
Использовать extID можно, но тогда:
на странице товара выводить какой код? extID?
в URL на странице товара какой код использовать? extID?
В базе потом искать тоже по extID? индекс делаем по extID?
в финале ID где будет использоваться? нигде?
а если везде вышеуказанном использовать id, то сотрудникам неудобно
в 1с один код, на сайте другой!
Использовать extID можно, но тогда:
на странице товара выводить какой код? extID?
в URL на странице товара какой код использовать? extID?
В базе потом искать тоже по extID? индекс делаем по extID?
в финале ID где будет использоваться? нигде?
а если везде вышеуказанном использовать id, то сотрудникам неудобно
в 1с один код, на сайте другой!
Действительно, и почему же newObject не сохраняет id? Может потому, что он предназначен для нового объекта. Ибо для существующего объекта есть getObject. А если нужно создать новый при условии, что такого ещё нет или обновить существующий, то делается это как написал выше Василий.
Пишу в раздел вопросы, т.к. в раздел «для разработчиков» рейтинг недостаточенСамое место в разделе «Вопросы».
Если поле PK всегда readOnly, то такое поведение newObject оправдано.
Если в оф. документации было бы это оговорено, то такое поведение newObject оправдано.
Если newObject игнорирует id и ругается на это в логах, то такое поведение приемлемо
текущая ситуация меня удивила, понять ее удалось только из исходников.
«решил поделить с сообществом. Может кому то время сэкономит.»
ИМХО я все сделал верно.
Если в оф. документации было бы это оговорено, то такое поведение newObject оправдано.
Если newObject игнорирует id и ругается на это в логах, то такое поведение приемлемо
текущая ситуация меня удивила, понять ее удалось только из исходников.
«решил поделить с сообществом. Может кому то время сэкономит.»
ИМХО я все сделал верно.
ИМХО я все сделал верно.Разбираться всегда лучше, чем не разбираться. Я так и научился.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.