我正在开发一个管理系统,允许用户管理他们的啤酒厂档案和啤酒库存。
我有三个相关的表:用户,啤酒厂和啤酒。用户和啤酒厂之间存在一对一的关系,啤酒厂和啤酒之间存在一对多的关系。每个表都有一个相应的DAO:UserDAO,BreweryDAO和BeerDAO。
例如,如果用户想要添加啤酒,他们会转到页面beer.php?brewery=123
,其中123
是将添加此新啤酒的啤酒厂的ID。如果用户想要更新啤酒,他们将转到同一页面,例如beer.php?id=456
,其中456
是将要编辑的啤酒的ID。
现在,当我去啤酒页面时,我需要两条信息:啤酒厂和啤酒,如果他们正在编辑。我还需要确保brewery属于登录用户。
我可以想到两种方法:
选项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 :(得分:0)
当你想要添加啤酒时,你实际上想要向啤酒厂添加一些东西。所以我会改变应用程序的结构并创建一个brewery.php?id = breweryid来编辑啤酒厂。
这可能是一个可能的步骤,以保持您的文件更小(不需要外部elseif {} else {}结构,因为您只需要直接验证给定的id)并更专注于对象。至少你不必检查你是否真的想与啤酒或酿酒厂互动。
下一步是不加载完整的brewery-object只是为了将user-id与currentUser进行比较。你可以简单地创建一个像
这样的方法/**
* @param int $breweryId
* @param int $userId
* @return boolean
*/
public function breweryBelongsToUser($breweryId, $userId){
// return false if no entry in database
}