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