我正在使用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);
}
}
但那真的感觉不对劲。任何建议都将不胜感激。
答案 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);
}