我对OO / DB关系中的操作有点了解......
以下是数据库模型:
CREATE TABLE User
Id
CREATE TABLE Location
userId
// EDIT oups, wrong !
// placeId
// Should be :
seatId
CREATE TABLE Game
locationId
现在有些代码:
class User
{
private Location locations[]; // need this for several reasons...
public function loadFromDatabase()
{
// Load data from DB
// ...
result = DB::query("SELECT Id FROM Locations WHERE userId="+this->Id);
foreach(result)
{
l = new Location();
l->loadFromDatabase(result);
locations[] = l;
}
}
}
class Location
{
private User user;
public function loadFromDatabase()
{
...
}
}
class Game
{
private Location location;
public loadFromDatabase()
{
/*
Here comes the problem :
how to have a reference to a location
created by the User class ?
*/
}
}
用户在多个地点玩游戏。 编辑:对于用户在座位上玩的每个位置。或者在另一个座位...... 当我想知道游戏的位置时,我访问Game.location。当我想知道是谁播放它时,我访问Game.location.user
这是我的问题:我希望Game.location与User.locations之一相同,我不知道如何做到这一点...... 而且,在全球范围内,我觉得我的代码有些不对劲......
有任何帮助吗? 感谢
答案 0 :(得分:1)
由于placeId
表中有Location
,我假设有Place
表描述了实际存在的位置,而Location
表只是表示用户和地点之间的多对多映射。
在这种情况下,Location
不需要拥有自己的Id
,也不需要是一个类,但Place
会这样做。
要从数据库中加载每个对象的一个实例,请将实例缓存在每个类的静态映射中。
class Place
{
// Static
private static Place loadedPlaces[];
public static function get(id)
{
if (!loadedPlaces[id])
{
loadedPlaces[id] = new Place(id);
loadedPlaces[id]->loadFromDatabase();
}
return loadedPlaces[id];
}
// Non-static
private id;
public function loadFromDatabase()
{
// ...
}
}
然后,要获取对用户或游戏属性的位置的引用,只需通过静态方法访问它们。
class User
{
public function loadFromDatabase()
{
result = DB::query("SELECT placeId FROM Locations WHERE userId="+this->Id);
foreach(result)
{
places[] = Place::get(result);
}
}
}
class Game
{
public function loadFromDatabase()
{
place = Place::get(place);
}
}
这使用: