【问题标题】:how do i pattern a php database call?我如何设计一个 php 数据库调用?
【发布时间】:2013-03-13 17:52:18
【问题描述】:

规范:PHP 5 和基于 Codeigniter 框架构建的 mySQL。

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

当我查找要向用户显示的游戏信息时,我无法弄清楚如何动态链接这两个表。我很好奇是否可以通过一次查询获得所有信息。问题是,我需要先查询game 表才能找出运动名称。

如果这不可能,我的下一个想法是使用两个查询来完成。让我的game_model 查询比赛表,然后根据运动名称,调用适当的运动特定模型(即soccer_game_model)并获取运动特定信息。

我还将game 对象传递给soccer_modelsoccer_model 将使用该对象为我构建一个soccerGame 对象。这对我来说似乎有点傻,因为我正在构建父对象,然后将其提供给扩展类以创建一个全新的对象?

想法?

感谢您的帮助。

编辑:

游戏桌

gameId
sport (soccer, basketball, football, etc)
date
other data

足球比赛桌

soccerGameId
gameId
soccer specific information

足球比赛桌

footballGameId
gameId
football specific information

其他运动等等

所以我需要先了解这项运动是什么,然后才能决定我需要从哪个运动特定表中提取信息。

更新:

感谢大家的意见。似乎动态 SQL 只能通过存储过程实现,我现在不太熟悉。即使有他们,它仍然有点混乱。现在我将走两条查询路线,一条获取运动名称,然后切换获取正确的型号。

现在从 PHP 方面来看,获取一个 game 对象,将其传递给我的 soccer_game_model,然后让它返回一个 soccer_game 对象,这似乎有点愚蠢。原始game 的子代。必须这样做吗?还是我在这里从 OO 的角度遗漏了什么?

【问题讨论】:

  • 我无法理解问题和设置。你能发布你的表的结构吗?

标签: php mysql oop codeigniter


【解决方案1】:

要扩展 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() 返回一个对象数组。

编辑:我添加了第二个表格参数,让您可以传入您可以加入的表格名称

如果您此时不知道在计划中选择哪种运动,那么您可能想退后一步,看看如何添加它以便您知道。我不愿意为所有运动表添加多个连接,因为您会遇到问题。

【讨论】:

  • 感谢您的评论。问题不在于如何进行连接,问题在于如何确定要连接的表。一些game 表可能必须加入footballGame 表,而另一些表必须加入soccerGame 表。
  • 我会查看您的应用程序的整体设计,因为唯一的其他方法是遍历表,直到找到匹配项。也许将游戏类型存储在游戏表中将是一个想法。如果名称与表相对应,则使用上述方法查找右表将很容易。我假设游戏只能是一种类型,例如足球,当然是足球。
  • game 表确实知道它是什么运动。我可以用它来动态加入正确的表吗?您建议的方式需要先调用game 表,然后再调用soccerGame 表。也许这是唯一的方法,但我希望有人知道只使用一个查询的方法。
  • 不要太担心额外的查询。在需要时而不是之前进行扩展。一旦你有了正确的表名,你就不需要做一个 JOIN 查询,所以它是一个简单、漂亮和快速的选择。您可以在应用程序中加入数据。
  • 我同意编辑。在这一点上我会知道运动类型。 2 个问题似乎就是答案。
【解决方案2】:

更新

在查找游戏数据时考虑传递“sport”参数。作为一个隐藏的领域,很可能。然后,您可以在模型中使用 switch 语句:

switch($gameValue) {
  case 'football': $gameTable = "footballGame"; break;
  case 'soccer': $gameTable = "soccerGame"; break;
}

然后根据以下内容进行查询:

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

您可以将表格与联接结合起来。 http://www.w3schools.com/sql/sql_join.asp

例如,如果您需要根据 footballGameId 为 15 从gamefootballGame 获取所有数据:

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

【讨论】:

  • 是的,我很熟悉连接。问题是在我从game 表中获得一些信息之前,我不知道要加入哪个表。没有两个查询可能是不可能的。好奇是不是
  • 感谢您的更新。 game 表确实知道它属于什么运动,所以这绝对是一种选择,也是其他人给出的建议。我想我很好奇是否可以通过 1 个查询来完成。 IE。动态使用第一个表的字段名作为连接表的表名。
【解决方案3】:

Check this Stack Overflow answer for options 了解如何通过标准查询进行操作。然后,您可以根据需要将其转换为活动记录(尽管如果您的应用中不需要与 DB 无关的调用,这可能会很复杂且不值得您花时间)。

值得一提,执行多个查询并没有错,只是它可能比其他方法慢。尝试几个选项,看看最适合您和您的应用的选项。

【讨论】:

  • 感谢您的链接。我认为这越来越接近答案,它让我回到了我曾经想过的其他事情上。是否可以在连接中使用字段名作为表名?即 SELECT tableName FROM game as g LEFT JOIN g.tableName as newTable。这可能吗?顺便说一句,我目前在整个网站都使用 AR
  • 不,你不能。你能做的最好的事情是这样的(它有自己的警告):stackoverflow.com/questions/8171592/…
猜你喜欢
  • 1970-01-01
  • 2013-07-09
  • 1970-01-01
  • 2012-10-24
  • 2010-11-18
  • 1970-01-01
  • 1970-01-01
  • 2017-12-27
相关资源
最近更新 更多