如何设置php数据库调用的模式?

如何设置php数据库调用的模式?,php,mysql,oop,codeigniter,Php,Mysql,Oop,Codeigniter,规范:PHP5和mySQL构建在Codeigniter框架之上 我有一个名为game的数据库表,然后是体育专用表,如soccerGame和footballGame。这些特定于运动的表格有一个gameId字段链接回game表格。我有相应的类game和soccerGame/footballGame,它们都扩展了game 当我查找要向用户显示的游戏信息时,我很难确定如何动态链接这两个表。我很好奇,一次查询是否能得到所有的信息。问题是,我需要先查询game表以找出运动名称 如果这不可能,我的下一个想法是

规范:PHP5和mySQL构建在Codeigniter框架之上

我有一个名为
game
的数据库表,然后是体育专用表,如
soccerGame
footballGame
。这些特定于运动的表格有一个
gameId
字段链接回
game
表格。我有相应的类
game
soccerGame
/
footballGame
,它们都扩展了
game

当我查找要向用户显示的游戏信息时,我很难确定如何动态链接这两个表。我很好奇,一次查询是否能得到所有的信息。问题是,我需要先查询
game
表以找出运动名称

如果这不可能,我的下一个想法是使用两个查询。让我的
game\u model
查询游戏表,然后根据运动名称,调用相应的运动特定模型(即
soccer\u game\u model
)并获取运动特定信息

我还将
game
对象传递到
soccer\u模型
,而
soccer\u模型
将使用该对象为我构建一个
soccerGame
对象。这对我来说似乎有点愚蠢,因为我正在构建父对象,然后将其交给扩展类来创建一个全新的对象

想法

谢谢你的帮助

编辑:

游戏桌

gameId
sport (soccer, basketball, football, etc)
date
other data
足球游戏桌

soccerGameId
gameId
soccer specific information
footballGameId
gameId
football specific information
足球游戏桌

soccerGameId
gameId
soccer specific information
footballGameId
gameId
football specific information
其他运动项目也是如此

所以我需要知道什么是运动,然后才能决定我需要从哪个运动特定的表格中获取信息

更新:

谢谢大家的意见。动态SQL似乎只能通过存储过程实现,而我目前还不太熟悉这一点。即使有他们,还是有点乱。现在我将执行两个查询路线,一个是获取运动名称,然后是切换以获取正确的型号


从PHP的角度来看,获取一个
game
对象,将其传递给(比如)我的
soccer\u game\u模型
,然后让它返回一个
soccer\u game
对象,这是原始
游戏
的子对象,这似乎有点愚蠢。必须这样做吗?还是从面向对象的角度来看我遗漏了什么?

更新

在查找游戏数据时,请考虑传递“sport”参数。作为隐藏字段,最有可能。然后,可以在模型中使用switch语句:

switch($gameValue) {
  case 'football': $gameTable = "footballGame"; break;
  case 'soccer': $gameTable = "soccerGame"; break;
}
然后根据以下内容进行查询:

"SELECT * 
FROM ". $gameTable . "
...etc

可以将表与联接组合起来

例如,如果您需要根据足球游戏ID为15从
游戏
足球游戏
获取所有数据:

SELECT *
FROM footballGame a
LEFT OUTER JOIN game b ON a.id = b.gameId
WHERE footballGameId = 15

为了扩展Devin Young的答案,您可以使用Codeigniter的活动记录类实现这一点,如下所示:

public function get_game_by_id($game_id, $table)
{
    return $this->db->join('game', 'game.id = ' . $table .  '.gameId', 'left')
    ->where($table . '.gameId', $game_id)
    ->get('game')
    ->result();
}
因此,您通过共享的gameId加入表,然后使用where子句找到正确的一个。最后,使用result()返回一个对象数组

编辑:我添加了第二个表参数,允许您输入表名,您可以加入soccerGame、footballGame表等

如果你不知道在这个项目中选择哪项运动,那么你可能想退一步,看看如何添加这些内容,这样你就知道了。我不愿意将多个连接添加到所有sport表中,因为您将遇到问题。

关于如何通过标准查询进行连接。然后,如果您愿意,您可以将其转换为活动记录(尽管这可能很复杂,如果您的应用程序中不需要DB不可知调用,那么不值得您花费时间)


不管它值多少钱,进行多个查询并没有什么错,只是可能比另一种查询慢。尝试一些选项,看看什么最适合你和你的应用。

我无法理解问题和设置。你能把你桌子的结构贴出来吗?是的,我对连接很熟悉。问题是在我从
游戏
表中获得一些信息之前,我不知道要加入哪个表。没有两个查询可能不可能。好奇是不是谢谢你的更新。
game
表确实知道它属于哪项运动,因此这绝对是一个选项,也是其他人给出的建议。我想我很好奇是否可以用一个查询来完成它。ie.动态使用第一个表的字段名作为联接表的表名。感谢您的评论。问题不在于如何进行联接,而在于如何确定要联接的表。一些
game
表可能必须与
footballGame
表连接,而另一些则必须与
soccerGame
表连接。我将查看应用程序的总体设计,因为唯一的其他方法是在表中循环,直到找到匹配项。也许将游戏类型存储在游戏表中是一个简单的方法和想法。如果名称与表相对应,则使用上述方法查找右侧的表将很容易。我假设一个游戏只能是一种类型,例如足球,当然是足球。
游戏
表确实知道它是什么运动。我可以使用它动态地加入正确的表吗?您建议的方式需要先调用
game
表,然后调用
soccerGame
表。也许这是唯一的方法,但我希望有人知道一种只使用一个查询的方法。不要太担心额外的查询。在需要时进行缩放,而不是在之前。一旦您有了正确的表名,您就不需要执行联接查询,因此它是一个简单、漂亮和快速的选择。你可以在应用程序中加入数据。我同意编辑。在这一点上,我将知道运动类型。2个问题似乎就是答案。谢谢你的链接。我认为这离答案越来越近了,这让我想起了我曾经想到的另一件事。是否可以使用字段名作为联接中的表名?i、 e.选择<