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


How to properly load a Database row into a class in php

我正在使用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);
    }
}

但这真的感觉不对。 任何建议将不胜感激。

如果您已经有一个扩展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;
}

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

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

或者,假设您的用户类中已经有一个 find 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-objecthttp://kohanaframework.org/3.1/guide/orm/examples/simple

也许是这样的:

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