Одна ссылка на несколько объектов - PullRequest
0 голосов
/ 07 февраля 2011

Я немного о том, что делать в отношении OO / DB ...

Вот модель 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, а язнаете, как это сделать ... И в целом я чувствую что-то не так в своем коде ...

Любая помощь?Спасибо

1 Ответ

1 голос
/ 07 февраля 2011

Поскольку у вас есть 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);
    }
}

Используется:

...