我的工作是一个管理系统,允许用户管理他们的啤酒厂概况和啤酒库存。
我有三个相关的表:用户、啤酒厂和啤酒。用户和啤酒厂之间有一对一的关系,啤酒厂和啤酒之间有一对多的关系。每个表都有一个对应的DAO: UserDAO、BreweryDAO和BeerDAO。
例如,如果用户想要添加啤酒,他们将转到一个页面,beer.php?brewery=123,其中123是添加这种新啤酒的啤酒厂的ID。如果用户想要更新啤酒,他们将转到相同的页面,例如beer.php?id=456,其中456是将要编辑的啤酒的ID。
现在,当我进入啤酒页面时,我需要两条信息:啤酒厂和啤酒,如果它们正在编辑的话。我还需要确保啤酒厂属于登录用户。
我可以想出两种方法来做到这一点:
选项1:使用许多没有联接的查询
// 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:使用带有联接的单个查询
// 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,但随着关系的增加,它会变得非常混乱。我不太关心速度。还有其他方法来构造我的代码,因为这两个选项看起来都很混乱吗?
发布于 2016-05-26 08:47:39
当你想加啤酒的时候,你实际上想给啤酒厂添加一些东西。因此,我将更改应用程序的结构,并创建一个用于编辑啤酒厂的brewery.php?id=breweryid。
这将是一个可能的步骤,使您的文件更小一点(不需要外部的on {}on{}结构,因为您只需要直接验证给定的id),并且更多地关注对象。至少你不需要检查你是否真的想和啤酒或啤酒厂互动。
下一步是不要加载完整的啤酒厂对象,只是为了将用户id与currentUser进行比较。您可以简单地创建一个方法,如
/**
* @param int $breweryId
* @param int $userId
* @return boolean
*/
public function breweryBelongsToUser($breweryId, $userId){
// return false if no entry in database
}https://stackoverflow.com/questions/35563005
复制相似问题