2016-02-22 4 views
3

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

У меня есть три смежные таблицы: пользователи, пивоваренные заводы и пиво. Между пользователями и пивоваренными заводами существует связь 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, но он может стать довольно грязным, чем больше отношений есть. Я не слишком обеспокоен скоростью. Есть ли другой способ структурирования моего кода, поскольку оба варианта кажутся беспорядочными?

+0

что вы могли бы сделать, это поворотный стол 'brewery_user', которые имеют внешние ключи brewery_id Ref ID в пивоварне и user_id карты с идентификатором пользователя. Затем вы можете запросить это, чтобы получить доступ к пивоварням пользователей, чтобы затем проверить и т. Д., Поэтому отношение многих к многим и т. Д. Рассмотрит этот ответ. Http://stackoverflow.com/questions/2923809/many-to-many-relationships-examples для MTM –

ответ

0

Если вы хотите добавить пиво, вы действительно хотите добавить что-то к пивоварне. Поэтому я бы изменил структуру приложения и создал brewery.php? Id = breweryid для редактирования пивоваренных заводов.

Это был бы возможный шаг, чтобы ваши файлы были немного меньше (нет необходимости в внешней структуре elseif {} else {}, поскольку вам нужно только непосредственно проверить данный идентификатор) и больше сосредоточиться на объектах. По крайней мере, вам не нужно проверять, действительно ли вы хотите взаимодействовать с пивом или пивоварней.

Следующим шагом было бы не загружать весь объект пивоварни только для сравнения идентификатора пользователя с currentUser. Вы можете просто создать метод, как

/** 
* @param int $breweryId 
* @param int $userId 
* @return boolean 
*/ 
public function breweryBelongsToUser($breweryId, $userId){ 
    // return false if no entry in database 
} 
Смежные вопросы