[英]how do i pattern a php database call?
规范:PHP 5,mySQL构建于Codeigniter Framework之上。
我有一个名为game
的数据库表,然后是footballGame
game
和footballGame
等特定soccerGame
。 这些运动特定表有一个gameId
字段链接回game
表。 我有相应的类game
和soccerGame
/ footballGame
,其中两个延伸game
。
当我查找要向用户显示的游戏信息时,我无法确定如何动态链接这两个表。 我很好奇是否有可能通过一个查询获得所有信息。 问题是,我需要首先查询game
桌以找出运动名称。
如果那是不可能的,我的下一个想法是用两个查询来做。 让我的game_model
查询游戏表,然后根据运动名称,调用适当的运动特定模型(即soccer_game_model
)并获得运动特定信息。
我还将game
对象传递给soccer_model
, soccer_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的角度遗漏了一些东西?
UPDATE
在查找游戏数据时,请考虑传递“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获取来自game
和footballGame
的所有数据:
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 table等。
如果您不知道在该计划中此时选择哪项运动,那么您可能想退后一步,看看如何添加,以便您知道。 我不愿意为所有运动表添加多个连接,因为你会遇到问题。
有关如何通过标准查询执行此操作的选项 , 请查看此Stack Overflow应答 。 然后,如果你愿意,你可以把它变成活动记录(虽然如果你的应用程序中不需要与数据库无关的调用,这可能很复杂并且不值得你花时间)。
哇它的价值,做多个查询没什么不对,它可能比另一个慢。 尝试一些选项,看看什么最适合您和您的应用程序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.