1

Тема: doctrine save() всегда вызывает insert, никогда update

Изучаю doctrine. Пока, мягко говоря, фшоке. Многих привычных в Propel вещей нет, либо ведут себя совершенно не так.

Добило save().
Есть пара таблиц. Беру любой объект. Выполняю save(). Выполняется insert. Даже если через сгенерированый по таблицам frontend-модуль нажать OK в edit-страничке (ничего не меняя) - это клонирует запись, а не обновляет.

Смотрел свойства объекта прямо перед save() - он не новый, правильно отмечено какие поля изменились и т.д.
В то же время, в другой таблице этой же базы - такого прикола нету. В чем может быть причина? Понимаю, что может быть сам где-то накосячил, но где - идей нету. Гугл не помог, описания такой проблемы не нашел.

2

Re: doctrine save() всегда вызывает insert, никогда update

интересно,
ну если в одной таблице бок, а во второй все нормально, то конечно сам где-то накосячил.

посмотрите код форм, моделей, может что-то пропустили
без кода ничего сказать не могу, но хотелось бы тоже выяснить для себя причину вашей проблемы...

3

Re: doctrine save() всегда вызывает insert, никогда update

Да, случай возможно интересный, только вот проблема - у меня терпение кончилось. Сегодня сел разбираться, всплыло еще следующее: для только что созданного объекта одной из глючащих таблиц не работает getId(). Выдает

Warning: Invalid argument supplied for foreach() in /lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Record.php on line 1151

и пустой ответ. Все остальные поля getПоле() - нормально.  Так же для нее не работает edit через форму - выдает 404.


Сидеть ковырять доктрину у меня желания нет, так что собираюсь решить проблему на корню - перевестись на пропел, на нем я таких приколов не припоминаю default/smile

Отредактировано va (2010-03-14 14:31:00)

4

Re: doctrine save() всегда вызывает insert, никогда update

а покажите схему

5

Re: doctrine save() всегда вызывает insert, никогда update

Отправил в личку ввиду большого кол-ва полей

Сейчас частично перенес на Propel. Редактирование/сохранение не создает клонов, свежесозданный объект спокойно возвращает getId(). Схему генерирую по базе, ее не менял.

Отредактировано va (2010-03-14 16:54:48)

6

Re: doctrine save() всегда вызывает insert, никогда update

схему посмотрел, возможно проблема со связями
какой у вас тип базы?

конвертом схемы с базы стараюсь не пользоваться вообще, сколько всякой ненужной чепухи создается после конверта
если еще есть желание, то возможно стоит посмотреть http://www.doctrine-project.org/documen … ationships

доктрайн мне нравится больше пропела, но это ИМХО

7

Re: doctrine save() всегда вызывает insert, никогда update

А вы как разрабатываете бд?
Я рисую в mysql workbench, из него делаю export sql, полученый скрипт вставляю в phpmyadmin. Тип базы всегда innodb, иначе foreign key не пропишутся и не определятся при генерации схемы.
Вполне возможно, что действительно доктрина как-то не так скушала базу, такая мысль мне в голову не приходила.

8

Re: doctrine save() всегда вызывает insert, никогда update

я пишу схему руками, мне так удобней и я так точно знаю что в модели все пропишется правильно

тем более, мне кажется, это более гибкий способ
если понадобится внести в базу изменения, то:
1. в вашем случае придется менять в mysql workbench и проделывать тот же путь
2. а если делать изменения в самой схеме, то достаточно build-all (желательно пользоваться фикстурами или добавлять новые поля вручную)

9

Re: doctrine save() всегда вызывает insert, никогда update

подскажите, как сделать запись в БД (INSERT, DELETE...)? если возможно, приведите примеры плз.

10

Re: doctrine save() всегда вызывает insert, никогда update

http://www.doctrine-project.org/project … /manual/en
исчерпывающий мануал по Доктрине. Читайте и просвещайтесь.

И для начала определитесь, вы таки работаете с ORM или напрямую с базой. Потому что работая с ORM вы не пишете никаких инсертов. Вы создаете объект модели и вызываете у него метод save(). Все операции с базой ORM делает самостоятельно. Аналогично с удалением - получили объект, вызвали ему delete() - он удалился.
В редких случаях возможностей ORM недостаточно, и тогда нужна работа напрямую с БД через sql запросы. Но вам это точно не надо.

P.S. Раз уж тема снова поднята, по теме выше: если объект при комплексном сохранении всегда расценивается ORM как новый - у вас однозначно либо криво прописана связь между основным и этим «вечно новым» объектом, либо нестыковка со связанными полями (например «лишний» примари-ключ). Возможно связь «не в ту сторону», возможно она вообще с ошибкой и ORM не видит ее как связь. Это достаточно легко проверяется - чаще всего достаточно просто проверить, что Доктрина сгенерировала в base классах обоих криво связанных моделей.

Отредактировано relo_san (2010-06-15 17:10:30)

11

Re: doctrine save() всегда вызывает insert, никогда update

Cпасибо большое!
Ну в моем случае средств ORM хватит с головой=)
т.е мне нужно просто переопределить метод(или создать) save. Понял куда двигать дальше))