Как извлекать данные из базы данных в виде объектов?

#php #oop

#php #ооп

Вопрос:

В Lynda.com PHP с MySQL Помимо основ, автор Кевин Скоглунд представил эти методы как способ извлечения данных из базы данных в виде объектов:

     public static function find_by_id($id)
    {
        global $database;
        $id = $database->escape($id);
        $result_array = static::find_by_sql("SELECT * FROM " . static::$table_name . " WHERE id = {$id} LIMIT 1");
        return !empty($result_array) ? array_shift($result_array) : false;
    }

    public static function find_by_sql($sql)
    {
        global $database;
        $result_set = $database->query($sql);
        $object_array = array();
        while ($row = $database->fetch_array($result_set))
        {
            $object_array[] = static::instantiate($row);
        }

        return $object_array;
    }

    protected static function instantiate($record)
    {
        $class_name = get_called_class();
        $object = new $class_name();
        foreach ($record as $attribute => $value)
        {
            if ($object->has_attribute($attribute))
            {
                $object->$attribute = $value;
            }
        }
        return $object;
    }
 

Примером использования этого внутри пользовательского класса, например, может быть:

 $user = User::find_by_id(1);
echo $user->first_name;
 

Мой вопрос в том, что если у меня есть таблица для записей, например, со столбцом с именем «user» в качестве внешнего ключа, и я пытаюсь получить сообщение, используя вышеупомянутый метод, атрибутом пользователя будет просто число

 $post = Post::find_by_id(1);
echo $post->user; // This will return the id of the user
 

Тем не менее, я хочу иметь возможность делать что-то вроде этого:

 echo $post->user->first_name;
 

Как я могу выполнить что-то подобное? Будет ли это связано с использованием объединений? Заранее спасибо.

Комментарии:

1. вы хотите, например, ORM .. checkout Doctrine или Propel

2. Я хочу создать что-то простое для себя с целью обучения.

Ответ №1:

Прочитайте эту документацию. На этой странице объясняется сопоставление связей между объектами.

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/association-mapping.html