使用 PHP 和 Kohana 3,可以递归地查找和输出任何模型的关系吗?
Posted
技术标签:
【中文标题】使用 PHP 和 Kohana 3,可以递归地查找和输出任何模型的关系吗?【英文标题】:Using PHP and Kohana 3, can one recursively find and output any model's relationships? 【发布时间】:2010-10-13 22:48:07 【问题描述】:假设我们有一个包含许多帖子的用户模型。
帖子模型有很多类别
帖子模型也有很多评论。
我们如何动态找到用户模型之间的关系?
这个想法是为一个站点创建一个管理后端,在那里我可以拥有一个功能,当传递一个模型时,可以检索与该对象相关的所有数据,并根据找到的数据的关系显示它。
我猜我需要访问模型本身,而不是实例。
任何帮助将不胜感激,谢谢。
【问题讨论】:
您想要关系信息(元)还是所有相关记录? 好吧,如果我能找到那个信息,是的。 我想找到模型的所有关系,以及它所具有的关系类型。 为什么不在您的模型中创建自定义方法以返回您需要的格式的 $_has_one、$_has_many、$_belongs_to? 【参考方案1】:我终于做到了,所以这是我使用的代码,如果其他人想要的话。
我并没有声称自己是一名优秀的程序员,我还是个新手。
如果有人真的要使用它,并且需要一些关于我的逻辑的帮助,我会完整地注释掉它,但我今晚会空手而归......
public function get_child_objects($recursive = 0, $init = FALSE)
if ( ! $init )
Session::instance()->delete('model_register');
$init = TRUE;
$model_register = array();
else
$model_register = Session::instance()->get('model_register');
$return_array = array();
$parent_id = $this->id;
$parent_type = $this->_object_name;
// prevent unending loops of many to many relationships
if ( ! isset($model_register[$this->_object_name]) )
$model_register[$this->_object_name] = TRUE;
else
return;
Session::instance()->set('model_register', $model_register);
if ( ! count($this->_has_many))
return;
// foreach _has_many relationship get objects
foreach ($this->_has_many as $child_object_type => $child_object_data)
$child_object_type_singular = Inflector::singular( (string) $child_object_type);
$child_object_type_plural = Inflector::plural( (string) $child_object_type);
$many_to_many = FALSE;
if (isset($child_object_data['through']))
$many_to_many = TRUE;
if (isset($child_object_data['model']))
$child_object_type = $child_object_data['model'];
if ( ! $many_to_many)
$child_objects = ORM::factory($child_object_type_singular)
->where($parent_type.'_id', '=', $parent_id)
->find_all();
if ( ! count($child_objects))
continue;
else
$child_object_type_plural = Inflector::plural( (string) $child_object_type);
$child_objects = $this->$child_object_type_plural->find_all();
if ( ! count($child_objects))
continue;
$obj_arr = array();
foreach ($child_objects as $child_object)
if ( (bool) $recursive)
$recursive = $recursive - 1;
$obj_arr[$child_object->id] = $child_object->get_child_objects($recursive, $init);
else
$obj_arr[$child_object->id] = NULL;
$return_array[$child_object_type_plural] = $obj_arr;
// foreach
return $return_array;
// get_child_objects
【讨论】:
以上是关于使用 PHP 和 Kohana 3,可以递归地查找和输出任何模型的关系吗?的主要内容,如果未能解决你的问题,请参考以下文章
PHP Kohana 3 bootstrap.php for admin子文件夹
是否可以在不使用整个框架的情况下在 PHP 中为 ORM 安装 Kohana 库?
php 后台转发和重定向的区别及kohana框架当前url加参数方式