неожиданное поведение 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 и ругается на это в логах, то такое поведение приемлемо
текущая ситуация меня удивила, понять ее удалось только из исходников.
«решил поделить с сообществом. Может кому то время сэкономит.»
ИМХО я все сделал верно.
ИМХО я все сделал верно.Разбираться всегда лучше, чем не разбираться. Я так и научился.
                            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.