Как сделать, чтобы доктрина не пыталась обновить таблицу?

Я работаю над проектом, в котором мы используем представления для создания интерфейса/слоя между другой системой, которая является источником данных, но не имеет соответствующей модели. Таким образом, в моей системе эти представления на самом деле являются моделями. Все работает отлично до сих пор, кроме этой части:

-------------------------------
|Table    |Table        |View |
-------------------------------
|Order  > |OrderItem  > |Item |
-------------------------------

Relation: Order (has many)> OrderItem (has many)> Item.

Недавно я столкнулся с проблемой, когда он пытается сохранить весь набор отношений таблицы (порядок). Система должна сохранять заказ и его позиции (order-items). Но каким-то образом сохранение заканчивается обновлением модели элемента, которая является представлением, и, очевидно, возвращает эту ошибку:

Код:

$order->save();

Ошибка:

Data manipulation operation not legal on this view : UPDATE ITEM (...)

Есть ли способ отследить это, заставить этого не происходить или установить его как модель только для чтения?


person CesarScur    schedule 06.03.2013    source источник
comment
Привет Цезарь Скур. Довольно сложно понять вашу проблему. Не могли бы вы добавить пример кода? Это тоже PHP? Затем, возможно, пометьте его как PHP, так как это более популярный тег, чтобы привлечь больше внимания.   -  person Czar Pino    schedule 06.03.2013
comment
Добавил теги TY. Как я могу сделать вещь более ясной?   -  person CesarScur    schedule 06.03.2013


Ответы (1)


Эта ошибка возникает в mysql, когда представление состоит из элементов из разных таблиц.

Если вы редактируете столбцы из одной и той же таблицы, все в порядке, но если один и тот же запрос пытается редактировать столбцы для разных таблиц, у вас есть ОШИБКА.

Вы все еще используете Doctrine 1.2? Я думаю, что использовать представления с Doctrine было сложно Link

ТАКЖЕ ошибка может возникнуть из-за того, как вы объявили отношение к сущностям:

Наличие: Order Many-to-Many OrderItem Много-к-одному Item.

Вы должны убедиться, что отношение OrderItem > Item равно однонаправленный, и этот OrderItem является стороной-владельцем.

person Jeffrey Nicholson Carré    schedule 06.03.2013
comment
Я использую оракул в качестве БД. Я видел штуковину доктрины_представления, но в моем случае представление на самом деле является моделью. У меня есть бизнес-правила, прикрепленные к нему. Использование представления db — это просто способ взаимодействия с другой системой. Я мог бы использовать процедуру для заполнения обычной таблицы, но проблема останется: Я не хочу, чтобы доктрина обновляла эту таблицу. Мое описание действительно было неверным, его много =/ - person CesarScur; 07.03.2013
comment
Хорошо, но ошибка, которую вы получаете, связана с тем, что Doctrine пытается отредактировать представление таким образом, который не разрешен Oracle. вот причина ошибки и решение: ora-01732.ora-code.com. - person Jeffrey Nicholson Carré; 07.03.2013
comment
Не могли бы вы опубликовать процесс до сохранения ()? - person Jeffrey Nicholson Carré; 07.03.2013
comment
Решение, указанное оракулом, - это именно то, что я ищу, способ заставить доктрину не пытаться обновить представление, потому что я не вызываю прямое сохранение элемента и не могу предсказать, почему это происходит. Просто не следует ни при каких обстоятельствах. Я не могу пройти мимо, потому что это бизнес-логика и это тысяча строк. - person CesarScur; 07.03.2013
comment
Итак, вам нужно будет создать метод (пример: save_order()), выполняющий запрос для управления сохранением. таким образом вы точно знаете, что происходит. stackoverflow.com/questions/10961743 / - person Jeffrey Nicholson Carré; 07.03.2013
comment
Это не вариант из-за расширения программы. Тысячи строк и десятки правил, которые нужно переписать - person CesarScur; 07.03.2013