首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检索许多相关信息

检索许多相关信息
EN

Stack Overflow用户
提问于 2016-02-22 20:18:37
回答 1查看 170关注 0票数 3

我的工作是一个管理系统,允许用户管理他们的啤酒厂概况和啤酒库存。

我有三个相关的表:用户、啤酒厂和啤酒。用户和啤酒厂之间有一对一的关系,啤酒厂和啤酒之间有一对多的关系。每个表都有一个对应的DAO: UserDAO、BreweryDAO和BeerDAO。

例如,如果用户想要添加啤酒,他们将转到一个页面,beer.php?brewery=123,其中123是添加这种新啤酒的啤酒厂的ID。如果用户想要更新啤酒,他们将转到相同的页面,例如beer.php?id=456,其中456是将要编辑的啤酒的ID。

现在,当我进入啤酒页面时,我需要两条信息:啤酒厂和啤酒,如果它们正在编辑的话。我还需要确保啤酒厂属于登录用户。

我可以想出两种方法来做到这一点:

选项1:使用许多没有联接的查询

代码语言:javascript
复制
// 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:使用带有联接的单个查询

代码语言:javascript
复制
// 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,但随着关系的增加,它会变得非常混乱。我不太关心速度。还有其他方法来构造我的代码,因为这两个选项看起来都很混乱吗?

EN

回答 1

Stack Overflow用户

发布于 2016-05-26 08:47:39

当你想加啤酒的时候,你实际上想给啤酒厂添加一些东西。因此,我将更改应用程序的结构,并创建一个用于编辑啤酒厂的brewery.php?id=breweryid。

这将是一个可能的步骤,使您的文件更小一点(不需要外部的on {}on{}结构,因为您只需要直接验证给定的id),并且更多地关注对象。至少你不需要检查你是否真的想和啤酒或啤酒厂互动。

下一步是不要加载完整的啤酒厂对象,只是为了将用户id与currentUser进行比较。您可以简单地创建一个方法,如

代码语言:javascript
复制
/**
* @param int $breweryId
* @param int $userId
* @return boolean
*/
public function breweryBelongsToUser($breweryId, $userId){
    // return false if no entry in database
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35563005

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档