检索许多相关信息

时间:2016-02-22 20:18:38

标签: php optimization dao

我正在开发一个管理系统,允许用户管理他们的啤酒厂档案和啤酒库存。

我有三个相关的表:用户,啤酒厂和啤酒。用户和啤酒厂之间存在一对一的关系,啤酒厂和啤酒之间存在一对多的关系。每个表都有一个相应的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 ,但是关系越多,它就越混乱。我不太关心速度。有没有其他方法来构建我的代码,因为两个选项看起来都很混乱?

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
}