Почему в modx не работает метод save() для существующего объекта? (РЕШЕНО)
Все привет! Подскажите, пожалуйста, почему метод save() не работает для существующего объекта, хотя для нового — работает?
Пробую так:
Схема:
При этом для соседних объектов работает прекрасно. И на новые, и на существующие. Хотя там всё аналогично.
Пробую так:
$test = $modx->getObject('LjValues', ['order_id' => 3, 'field_id' => 1]);
echo $test->get('value');
$test->set('value', "тестовый тест");
if($test->save() === true){
echo $test->get('value');
}И всё как бы отлично, выводит сначала старое значение, потом в $test->save() === true, выводит новое значение. Но в базе остаётся старое, лог молчит.Схема:
<object class="LjValues" table="lj_values" extends="xPDOSimpleObject">
<field key="field_id" dbtype="int" precision="11" phptype="integer" null="false" />
<field key="value" dbtype="varchar" precision="191" phptype="string" null="false" />
<field key="order_id" dbtype="int" precision="11" phptype="integer" null="false" />
<aggregate alias="LjFields" class="LjFields" local="field_id" foreign="id" cardinality="one" owner="foreign" />
<aggregate alias="LjOrders" class="LjOrders" local="order_id" foreign="id" cardinality="one" owner="foreign" />
</object>Пробовал убирать связи, менять на xPDOObject, не работает…При этом для соседних объектов работает прекрасно. И на новые, и на существующие. Хотя там всё аналогично.
Комментарии: 17
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
И таблицу в modx_lj_fieldvalue.
Если объект сохранится, то вернется true. А если вернется true, то if сработает
Смущает именно момент с тем, что newObject работал полностью — создавал, устанавливал значения, сохранял. getObject получал, set работал, но не сохранял. Самое странное, что save отдавал true…
Да и в любом случае, как оно тогда могло заработать с другим именем таблицы, если структура осталась старой?
Всю информацию заношу и получаю только по связке order_id и field_id. Каждое из этих полей может дублироваться, но двух объектов, у которых оба эти поля попарно равны — нет. Всё проверяю в сниппете, прежде чем занести.
Там суть, что нужно создавать таблицу, структура которой может расширяться по горизонтали -Fields (то, что выводится в header таблицы) и по вертикали — уже сами Orders (то, что создаёт ряды). А Values уже, соответственно, по пересечению горизонтального и вертикального.
p.s. извиняюсь, что на две ветки отвечать получилось.
Может быть такое:
order_id = 1 / field_id = 1
order_id = 1 / field_id = 2
order_id = 1 / field_id = 3
order_id = 2 / field_id = 1
order_id = 2 / field_id = 2
order_id = 2 / field_id = 3
Но не может быть такого:
order_id = 2 / field_id = 2
order_id = 2 / field_id = 2
Это проверяется на стороне сниппета при сохранении информации.
Или есть вариант делать unique именно по двум колонкам разом?
Лично я не вижу необходимости в этой схеме наследоваться от xPDOSimpleObject.
Используйте xPDOObject, указывайте эти 2 поля как primary & unique, добавив такой индекс
Обновил ответ, изначально немного не так понял ваше сообщение.
order_id = 2 / field_id = 2
order_id = 2 / field_id = 2
Т.е. два объекта, у которых попарно равные order_id и field_id не могут существовать.
Не знал, что в одном индексе может быть несколько полей, посыпаю голову пеплом. Спасибо за полезный совет!
дабы не наступить на грабли
В этом случае:
1. mySql будет следить, чтобы не было дублей.
2. Значительно ускорится выборка таких записей.
Завтра попробую проверить с такой схемой и всеми названиями, как были раньше. Посмотрю, проблема в этом, или всё-же в другом.