Я работаю над системой администратора, которая позволяет пользователям управлять своим профилем пивоваренного завода и инвентарем пива.Извлечение многих связанных данных
У меня есть три смежные таблицы: пользователи, пивоваренные заводы и пиво. Между пользователями и пивоваренными заводами существует связь 1 к 1, а также отношения «один ко многим» между пивоваренными заводами и пивами. Каждая таблица имеет соответствующие DAO: UserDAO, BreweryDAO и BeerDAO, соответственно.
Если пользователь хочет добавить пиво, например, они перейдут на страницу, beer.php?brewery=123
, где 123
- это идентификатор пивоваренного завода, в который будет добавлено это новое пиво. Если пользователь хочет обновить пиво, они перейдут на ту же страницу, например. beer.php?id=456
, где 456
- это идентификатор пива, который будет отредактирован.
Теперь, когда я иду на страницу пива, мне нужны две информации: пивоварня и пиво, если они редактируются. Я также должен убедиться, что пивоварня принадлежит зарегистрированному пользователю.
я могу думать о двух способов сделать это:
Вариант 1: Используя множество запросов, не располагающих JOIN и
// get relevant data for adding a new beer
if (isset($_GET['brewery'])) {
$brewery = $breweryDAO->getBreweryById($_GET['brewery']);
// check if no brewery or brewery doesn't belong to user
if (!$brewery || $brewery->user_id != $currentUser->id) {
// error
}
// get relevant data for editing a beer
} elseif (isset($_GET['id'])) {
$beer = $beerDAO->getBeerById($_GET['id']);
if ($beer) {
$brewery = $breweryDAO->getBreweryById($beer->id);
}
// check if no beer, no brewery, or brewery doesn't belong to user
if (!$beer || empty($brewery) || $brewery->user_id != $currentUser->id) {
// error
}
} else {
// error
}
Вариант 2: Используя одиночные запросы с JOIN и
// get relevant data for adding a new beer
if (isset($_GET['brewery'])) {
// get user's brewery
$brewery = $breweryDAO->getBreweryByIdAndUser($_GET['brewery'], $currentUser->id);
// check if no brewery was found
if (!$brewery) {
// error
}
// get relevant data for editing an existing beer
} elseif (isset($_GET['id'])) {
// get user's beer AND brewery information all together
$beer = $beerDAO->getBeerByIdAndUser($_GET['id'], $currentUser->id);
// check if no beer was found
if (!$beer) {
// error
}
} else {
// error
}
При извлечении пива лучше делать отдельные запросы (Вариант 1) или использовать одиночные JOINed запросы (Вариант 2)? Моя забота о том, какой будет лучший подход к опросу нескольких сведений, которые зависят друг от друга. Обычно я делаю Вариант 1, но он может стать довольно грязным, чем больше отношений есть. Я не слишком обеспокоен скоростью. Есть ли другой способ структурирования моего кода, поскольку оба варианта кажутся беспорядочными?
что вы могли бы сделать, это поворотный стол 'brewery_user', которые имеют внешние ключи brewery_id Ref ID в пивоварне и user_id карты с идентификатором пользователя. Затем вы можете запросить это, чтобы получить доступ к пивоварням пользователей, чтобы затем проверить и т. Д., Поэтому отношение многих к многим и т. Д. Рассмотрит этот ответ. Http://stackoverflow.com/questions/2923809/many-to-many-relationships-examples для MTM –