У меня есть объект для «листинга», который имеет такие атрибуты, как id, имя, описание и т. д., Которые можно загрузить с помощью метода load ($ id).
У него также есть некоторые дополнительные атрибуты. Например несколько товаров (это отдельный объект). Чтобы повысить производительность, я загружаю их, когда вы пытаетесь получить к ним доступ с помощью list-> getProducts ().
Теперь мне нужен метод save в листинге, чтобы сохранить значения обратно в базу данных MySQL. Но я не уверен, как сохранить этот продукт чистым способом. Лучшим способом было бы добавить метод сохранения к объекту продуктов и вызвать его из объекта листинга, но при этом сохраняются только значения. Как мне обращаться с добавленными / удаленными продуктами? Я думаю, это должен делать объект листинга. Но как мне узнать, все ли продукты были удалены или они даже не были загружены (потому что к ним не было доступа)?
Все способы, такие как хранение логических загруженных продуктов, кажутся глупым решением. Ты знаешь, как с этим справиться? У меня неплохой опыт в программировании, но я хочу улучшить свою структуру, так как я всегда заканчиваю большим количеством беспорядка кода, если проекты становятся больше.






Я предполагаю, что мы говорим о добавлении, редактировании и удалении продуктов в вашей базе данных. Таким образом, вам, вероятно, понадобится метод «вставить» и метод «удалить» (вызываемый из вашего списка). а также метод «сохранить» (обновить).
Но проблема, насколько я понимаю, в том, что вы не знаете, какие из них использовать в той или иной линейке продуктов.
Если вы просто разрешаете пользователю вводить волей-неволей в поля ввода, чтобы вы не могли сказать, является ли это редактированием, вставкой или удалением (или действительно, какой продукт вы редактируете или удаляете, если вы разрешаете / каждый / поле, которое нужно изменить), то вы действительно усложняете свою жизнь - необходимо ли это с точки зрения бизнес-требований / дизайна пользовательского интерфейса?
Рассмотрим что-то вроде перечисления существующей информации только для чтения и предоставления кнопок редактирования / вставки / удаления.
Может быть, я загружаю список с его продуктами, удаляю продукт из массива, добавляю 2 новых и вызываю list-> save (). Теперь я хочу, чтобы продукт и ассоциация из таблицы list_product были удалены, 2 новых продукта были созданы и связаны в db. Я знаю запросы и все такое, но с каким объектом что мне делать? save () в "продукте"? Но это не могло создать ассоциации с листингом. И как я могу предотвратить удаление всех продуктов, если я не загружал их с помощью list-> loadProducts (), поскольку массив будет пуст?
Я действительно думаю, что вам было бы лучше сделать это, особенно часть базы данных, на уровне отдельного продукта - помимо всего прочего, выполнение всей партии сразу, безусловно, не масштабируется (и одновременные сеансы редактирования несколькими пользователями будут очень сложными обрабатывать). Боюсь, что на самом деле я говорю: «Не начинайте отсюда». (Есть причина, по которой типичная онлайн-корзина для покупок имеет кнопку удаления на каждой строке, а не позволяет вам редактировать ее.)
Думаю, я нашел более-менее хороший способ самостоятельно.
По первой проблеме (где что сохранять):
Сохранение основных атрибутов листинга в методе listing->save(),
позвонив в listing->products[]->save(), чтобы сохранить информацию о товарах,
синхронизация списка <-> товарных ассоциаций в listing->save().
Вторая проблема (удаление товаров только потому, что они не загрузились):
Это было довольно просто: listing->products = null -> не загружен, listing->products = array() -> загружен, но пустой. (Я должен был получить это раньше, ха-ха)
Думаю, я не объяснил это должным образом. У меня есть две модели, одна называется листингом, который имеет атрибуты id, name, description, products и метод load ($ id), который извлекает поля id, name и description из таблицы базы данных «листинг». Существует второй метод loadProducts (), который загружает продукты, связанные с листингом, из таблицы продуктов и сохраняет их (как массив продуктов) в атрибуте продуктов листинга. Вопрос: Как мне после манипуляций сохранить обратно в БД? save () метод, который сохраняет атрибуты id, name, description очень прост.