0

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

负责尝试识别是否传递了 ID 或 ORM 对象的 User 类也是如此。这似乎不适合良好的 OOP 实践,但我真的不确定最好的方法是什么。我目前所做的是在构造中:

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

}

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

4

3 回答 3

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;
}
于 2012-05-04T13:37:55.510 回答
0

在您的控制器中,使用 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-object
http://kohanaframework.org/3.1/guide/orm/examples/simple

于 2012-04-28T01:23:37.760 回答
0

也许是这样的:

public function __construct($user)
{
    $this->user_model = is_object($user) ? $user : ORM::factory('user', (int)$user);
}
于 2012-04-28T06:12:52.953 回答