Php 检索许多相关信息

Php 检索许多相关信息,php,optimization,dao,Php,Optimization,Dao,我正在开发一个管理系统,允许用户管理他们的啤酒厂档案和啤酒库存 我有三个相关的表:用户、酿酒厂和啤酒。用户和啤酒厂之间存在一对一的关系,啤酒厂和啤酒厂之间存在一对多的关系。每个表都有一个对应的DAO:UserDAO、BreweryDAO和BeerDAO 例如,如果用户想要添加啤酒,他们将进入一个页面,beer.php?brewery=123,其中123是将添加新啤酒的啤酒厂的ID。如果用户想要更新啤酒,他们将转到同一页面,例如beer.php?id=456,其中456是将要编辑的啤酒的id 现在

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

我有三个相关的表:用户、酿酒厂和啤酒。用户和啤酒厂之间存在一对一的关系,啤酒厂和啤酒厂之间存在一对多的关系。每个表都有一个对应的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)还是使用单联查询(选项2)?我关心的是,对于查询相互依赖的多个信息,哪种方法更好。我通常会选择选项1,但关系越多,就会变得相当混乱。我不太关心速度。由于两个选项看起来都很混乱,有没有其他方法来构造我的代码?

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

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

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

/**
* @param int $breweryId
* @param int $userId
* @return boolean
*/
public function breweryBelongsToUser($breweryId, $userId){
    // return false if no entry in database
}

你可以做的是一个pivot表
brewery\u user
,它在brewery中有外键brewery\u id ref id,并且user\u id映射到用户id。然后你可以查询这个表,让用户breweries进行检查,等等,那么多对多关系等等,看看这个MTM的答案