如何将数据库行正确加载到php中的类中

时间:2012-04-28 01:03:36

标签: php oop kohana

我正在使用Kohana 3.2,并不重要,但我正在编写一个应用程序,我将所有返回的数据库记录包装在特定的类中。我不知道我理解将数据库行加载到类中的最佳方法,因为有时它是一个ORM模型,有时它可能只是一个行ID。

因此,如果我想要一个包含所有用户的列表,那么从控制器看起来就像是:

控制器:

$users = User::find_all();

用户类

public static function find_all()
{
    $users_model = ORM::factory('user')->find_all();
    $users = array();
    foreach ($users_model as $user_model)
    {
        $users[] = User::instance($user_model);
    }
    return $users;
}

这很好用,但有时我需要加载一个只有id的用户对象,比如在一些动作之后再次举例:

控制器

$user_id = $_POST['user_id'];
$user = User::instance($user_id);

User类负责尝试识别ID或ORM对象是否已传入其中。看来这对于良好的OOP实践来说是不对的,但我真的不确定最好的方法是什么。我目前正在做的是构造:

public function __construct($user, $load = 'model')
{
    if ($load == 'model')
    {
        $this->user_model = $user;
    }
    if ($load == 'id')
    {
        $this->user_model = ORM::factory('user', $user);
    }

}

但那真的感觉不对劲。任何建议都将不胜感激。

3 个答案:

答案 0 :(得分:2)

如果您已经拥有扩展ORM的用户模型,那么您可能不需要类中的静态方法来获取所有用户或获取特定用户。

在您的控制器中,您可以做到让所有用户

$users = ORM::factory('user')->find_all();

获得单个用户

$user = ORM::factory('user', $user_id);

如果您仍想沿着包装路线往下走,您可以使用这样的功能

public static function all() {
    $users = ORM::factory('user')->find_all();
    if (count($users)) {
        return $users;
    }
    return false;
}

public static function get($user_id) {
    $user = ORM::factory('user', $user_id);
    if ($user->id) {
        return $user;
    }
    return false;
}

答案 1 :(得分:0)

在您的控制器中,使用ORM根据ID获取用户。

$user_id = $_POST['user_id'];
$user = ORM::factory('user', $user_id);

或者假设您已经在用户类中找到了all,请添加find_one()方法:

用户类

public static function find_one($user_id)
{
    $user = ORM::factory('user', $user_id);
    return $user;
}

控制器

$user_id = $_POST['user_id'];
$user = User::find_one($user_id);

参见Kohana文档 http://kohanaframework.org/3.1/guide/orm/using#finding-an-object
http://kohanaframework.org/3.1/guide/orm/examples/simple

答案 2 :(得分:0)

也许是这样的:

public function __construct($user)
{
    $this->user_model = is_object($user) ? $user : ORM::factory('user', (int)$user);
}