Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/34: Рейтинг темы: голосов - 34, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 12.07.2013
Сообщений: 34

Многое ко многим: товары и заказы

02.11.2015, 04:13. Показов 6976. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня есть таблица с товарами, есть таблица с заказами. Не пойму как их связать по типу многое ко многим.
В один заказ может входить несколько товаров, при этом один товар может соответствовать нескольким заказам.
Какие столбцы должны быть в каждой таблице?
В первой таблице у меня: Id товара, название, описание, стоимость, остаток на складе.
В третьей должно быть: Id заказа, дата заказа (по идее и дата не нужна, но чтобы таблица в 1 столбец не был)
Во второй промежуточной должно быть: Id товара, Id заказа, связи по Id.
При оформлении заказа, при нажатии на кнопку создается строка в третьей таблице, Id автоинкремент.
Дальше во вторую таблицу записываются товары с различными Id товара, но одинаковым Id заказа.
А если добавить в заказ несколько одинаковых товаров, то что делать?
И как мне вообще генерировать Id заказа, если его вытащить невозможно практически? Нажал на кнопку, создалась строка, допустим 4 | 02.11.2015 11:00. Как мне теперь вытащить Id товара = 4, если он независимо генерируется при добавлении даты в таблицу? Поиск последней строки в таблице такое себе дело. Единственная мысль - генерировать на основе session_id()
Вытащить его нужно чтобы добавить информацию из заказа во вторую таблицу:
Id товара | Id заказа
|
|
Миниатюры
Многое ко многим: товары и заказы  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.11.2015, 04:13
Ответы с готовыми решениями:

Связь многое-ко-многим
Добрый день всем. Вопрос по связи многое-ко-многим: есть две таблички:Author и Article (у каждого автора может быть много статей и у каждой...

Django admin связи многое ко многим, как реализовать?
Есть три таблички, ода связующая. Хочу реализовать функционал, чтоб в табличке 1 в админке можно было добавлять записи и там же добавлять...

Спрос на товары: заказы автомобилей
Здравствуйте. Есть база данных, в которой содержатся заказы автомобилей. Нужно для каждого автомобиля определить сколько раз он...

9
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,909
02.11.2015, 09:04
LokiHellbringer, я бы не стал вообще связывать таблицы заказов и товаров. В этом есть несколько важных минусов:
1. Если вы поменяете название/цену товара, эти изменения коснутся уже выполненных заказов, и будет хаос.
2. Если вы удалите товар... сами понимаете, что будет.

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

products
SQL
1
id_product | name | price
orders
SQL
1
id_order | create_date
products_to_orders
SQL
1
id_order_product | id_order | name | price
Цитата Сообщение от LokiHellbringer Посмотреть сообщение
А если добавить в заказ несколько одинаковых товаров, то что делать?
Добавлять для каждого товара новую запись.
Цитата Сообщение от LokiHellbringer Посмотреть сообщение
И как мне вообще генерировать Id заказа, если его вытащить невозможно практически? Нажал на кнопку, создалась строка, допустим 4 | 02.11.2015 11:00.
Не понял, о чём вы. Надеюсь, не в файлах собираетесь данные хранить? После добавления новой записи вызываете функцию mysql_insert_id, она возвращает id последней добавленной записи.

Цитата Сообщение от LokiHellbringer Посмотреть сообщение
Поиск последней строки в таблице такое себе дело. Единственная мысль - генерировать на основе session_id()
Опять же, непонятно, о чём речь и зачем.
1
576 / 514 / 253
Регистрация: 26.09.2010
Сообщений: 2,603
02.11.2015, 09:46
Цитата Сообщение от LokiHellbringer Посмотреть сообщение
Не пойму как их связать по типу многое ко многим.
я бы сделал что-то примерно такое:
таблица с товаром
SQL
1
2
3
4
5
6
7
8
CREATE TABLE IF NOT EXISTS `tovar` (
  `Id` INT(11) NOT NULL AUTO_INCREMENT,
  `nazvanie` CHAR(100) NOT NULL,
  `opisanie` CHAR(255) NOT NULL,
  `cena` DECIMAL(10,2) NOT NULL,
  `na_sklade` INT(11) NOT NULL,
  PRIMARY KEY (`Id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
таблица для заказа
SQL
1
2
3
4
5
6
7
8
CREATE TABLE IF NOT EXISTS `tovar` (
  `Id` INT(11) NOT NULL AUTO_INCREMENT,
  `nazvanie` CHAR(100) NOT NULL,
  `opisanie` CHAR(255) NOT NULL,
  `cena` DECIMAL(10,2) NOT NULL,
  `na_sklade` INT(11) NOT NULL,
  PRIMARY KEY (`Id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
теперь если даже удалить наименование то в БД останется инфа о сделанном заказе, просто в корзине надо сделать возможность увеличить число заказываемых единиц, во вторую таблицу добавлять уже готовый заказ
0
0 / 0 / 0
Регистрация: 12.07.2013
Сообщений: 34
02.11.2015, 17:10  [ТС]
Цитата Сообщение от Jodah Посмотреть сообщение
На мой взгляд, лучше при создании заказа копировать информацию о товарах в новую таблицу, примерно так:
А зачем тогда 3 таблицы? Можно обойтись двумя.
Цитата Сообщение от Jodah Посмотреть сообщение
Не понял, о чём вы. Надеюсь, не в файлах собираетесь данные хранить? После добавления новой записи вызываете функцию mysql_insert_id, она возвращает id последней добавленной записи.
Если несколько пользователей одновременно будут оформлять заказ, то нужно как-то определить чей заказ соответствует id_order, который автоинкремент. Ведь значение понадобится чтобы потом добавлять данные в третью таблицу products_to_orders.
Цитата Сообщение от Виталюска Посмотреть сообщение
таблица для заказа
Одинаковая? не понял.

Видел пример, в котором массив заказанных товаров забивается в переменную и отправляется в значение ячейки:
PHP
1
$data=addslashes(serialize($dump))
У меня в переменной $_SESSION сначала создается массив idтовара=>количество, потом в двух циклах перебирается таблица с товарами и этот массив, формируя массив Id товара | Название | Описание | Цена | Количество, который передается в корзину. Счетчик количества обновляется нажатием на кнопку "Добавить в корзину" на странице с каталогом товаров. Напротив каждого товара есть своя кнопка.
0
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,909
02.11.2015, 17:57
Лучший ответ Сообщение было отмечено LokiHellbringer как решение

Решение

Цитата Сообщение от LokiHellbringer Посмотреть сообщение
А зачем тогда 3 таблицы? Можно обойтись двумя.
Можете привести пример с 2 таблицами?
Цитата Сообщение от LokiHellbringer Посмотреть сообщение
Если несколько пользователей одновременно будут оформлять заказ, то нужно как-то определить чей заказ соответствует id_order, который автоинкремент.
mysql_insert_id вернёт вам нужный идентификатор, который был сгенерирован автоинкрементом. Последний не из таблицы, а последний созданный в текущем mysql подключении. Это как раз то, что вам нужно.
1
0 / 0 / 0
Регистрация: 12.07.2013
Сообщений: 34
02.11.2015, 18:56  [ТС]
2 таблицы
products:
SQL
1
id_product++ | name | price
oders:
SQL
1
id++ | id_order=session_id() | name | price
Просто копируем необходимые данные из таблицы с товарами и вставляем в таблицу с заказами.
SQL
1
2
3
4
5
6
1 | lq54l74u31a09ncdr02nvgt6c5 | Баллон 1 | 100
2 | lq54l74u31a09ncdr02nvgt6c5 | Баллон 1 | 100
3 | lq54l74u31a09ncdr02nvgt6c5 | Баллон 3 | 300
4 | lq54l74u31a09ncdr02nvgt6c5 | Баллон 5 | 500
5 | eug3r5elb287qcn7ubj2cp8fp2 | Баллон 2 | 200
6 | eug3r5elb287qcn7ubj2cp8fp2 | Баллон 3 | 300
либо
orders:
SQL
1
id++ | $data
PHP
1
$data=addslashes(serialize($dump))
если использовать mysql_insert_id то да, нужно 3 таблицы. Может ли быть конфликт если 2 пользователя одновременно будут оформлять заказ? т.е. первый генерирует id_orders=1, второй генерирует id_orders=2, первому возвращается id=2 и его товары, второму тоже самое.
0
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,909
02.11.2015, 19:04
Лучший ответ Сообщение было отмечено LokiHellbringer как решение

Решение

Цитата Сообщение от LokiHellbringer Посмотреть сообщение
id++ | id_order=session_id() | name | price
Не рекомендую так делать. Работать с числовыми идентификаторами и разделением таблиц гораздо удобней. Особенно когда нужно будет делать визуальный просмотр и редактирование, встретите гораздо больше проблем, чем выгоды сейчас.

Цитата Сообщение от LokiHellbringer Посмотреть сообщение
Может ли быть конфликт
Нет. Повторюсь, берётся не последний id вообще, а последний id, сгенерированный в текущем mysql-соединении, а оно у каждого пользователя своё, уникальное.
1
0 / 0 / 0
Регистрация: 12.07.2013
Сообщений: 34
02.11.2015, 19:18  [ТС]
Понял, спасибо, так и сделаем.
0
576 / 514 / 253
Регистрация: 26.09.2010
Сообщений: 2,603
02.11.2015, 22:14
Цитата Сообщение от LokiHellbringer Посмотреть сообщение
Одинаковая? не понял.
извини не то копирнул вот вторая таблица
SQL
1
2
3
4
5
6
7
8
9
10
CREATE TABLE IF NOT EXISTS `chek` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `chek_date` DATE NOT NULL,
  `chek_nr` INT(11) NOT NULL,
  `tovar_nazvanie` CHAR(100) NOT NULL,
  `tovar_cena` DECIMAL(10,2) NOT NULL,
  `tovar_colichestvo` INT(2) NOT NULL,
  `tovar_total_price` DECIMAL(10,2) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
0
0 / 0 / 0
Регистрация: 12.07.2013
Сообщений: 34
06.11.2015, 00:59  [ТС]
Цитата Сообщение от Jodah Посмотреть сообщение
Не рекомендую так делать. Работать с числовыми идентификаторами и разделением таблиц гораздо удобней. Особенно когда нужно будет делать визуальный просмотр и редактирование, встретите гораздо больше проблем, чем выгоды сейчас.
Как мне это дело теперь вытащить? По идее нужно для каждого заказа создавать табличку <table> плюс одинаковые товары группировать по количеству? Есть изящный способ для этого?
У меня только мысль выводить в виде массива, и оперировать уже с ним.
Миниатюры
Многое ко многим: товары и заказы  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.11.2015, 00:59
Помогаю со студенческими работами здесь

Вывести заказы созданные пользователем, который не разу не выполнял заказы
Такая проблема: есть 2 таблицы в одной содержатся заказы, кто их создал и кто исполнил, в другой имя пользователя. Надо вывести заказы...

Заказы появляются с опозданием, невидимые заказы
Здравствуйте! Вопрос следующий - владелец магазина жалуется на проблему, клянется, что некоторые заказы появляются с опозданием на день. Т....

Нужно сделать в запросе условие отбора по ФИО заказчика, при котором бы отображались все заказы по этому заказчику, или заказы всех заказчиков
SELECT Заказы.ФИО, Заказчики.ВУЗ, Заказы., Заказы.Стоимость, Заказы.примечание FROM Заказчики INNER JOIN Заказы ON Заказчики.ФиО =...

Entity Framework 6. Code First. Связь один-ко-многим и многие-ко-многим одновременно
Здрасти. Есть таблица юзеров и объявлений. У юзера может быть множество объявлений. Здесь действует связь один-ко-многим. Но юзер также...

Определить тип связи между таблицами. Связь много-ко-многим или один-ко-многим?
Какой тип связи между таблица match и hero, match и team? Склоняюсь к варианту много-ко-многим (например, в матче участвуют только две...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru