Kohana 3:从ORM模型获取相关数据

时间:2010-10-05 13:35:20

标签: php orm kohana

使用Kohana 3的ORM模型时,从相关模型领域获取数据的最佳方法是什么?例如,我有一名员工,他有一家公司,并且有很多任务。我如何从公司模型和分配模型中的字段中获取数据(即在has_one和has_many关系中)?

编辑:根据要求,以下是相关模型。

用户模型

class Model_User extends ORM {
    protected $_table_name = 'user';
    protected $_primary_key = 'id';
    protected $_primary_val = 'username';
    protected $_has_many = array(
        'task' => array(
            'model' => 'task',
            'foreign_key' => 'user',
        ),
    );
    protected $_belongs_to = array(
        'company' => array(
            'model' => 'company',
            'foreign_key' => 'company'
        ),
    );

任务模型

class Model_Task extends ORM {
    protected $_table_name = 'tasks';
    protected $_primary_key = 'id';
    protected $_primary_val = 'name';
    protected $_belongs_to = array(
        'project' => array(
            'model' => 'project',
            'foreign_key' => 'project'
        ),
        'user' => array(
            'model' => 'user',
            'foreign_key' => 'user'
        ),
    );

公司模式

class Model_Company extends ORM {
    protected $_table_name = 'companies';
    protected $_primary_key = 'id';
    protected $_primary_val = 'name';
    protected $_has_many = array(
        'user' => array(
            'model' => 'user',
            'foreign_key' => 'company'
        ),
    );

}

代码投掷错误,来自控制器

$users = ORM::factory('user')->find_all();
$list = array();
foreach($users as $user) {
   $list[$user->id] = array(
     'username' => $user->username,
     'email' => $user->email,
     'company' => $user->company->name  //error:Trying to get property of non-object
   )
}

3 个答案:

答案 0 :(得分:2)

  1. 对多个关系使用复数形式(has_many)。公司有很多用户,用户有很多任务等。它并不重要但推荐。
  2. users表中公司的列名是什么?似乎是company而不是company_id。如果是这样,您可以重命名此外键或关系名称。

答案 1 :(得分:0)

要获得你要做的公司

$employee->company

所以你可以用

获得公司的财产
$employee->company->property

要获得你要做的作业

$employee->company->assignments->find_all();

在调用find_all()或find()之前,您还可以链接其他查询方法,例如 - > where()。

答案 2 :(得分:0)

好吧,如果您的员工只能属于一家公司,那么访问该公司就会这样做:

$company = $employee->company;

然后,您可以像访问任何其他模型一样访问$company属性(字段)。

我相信您可以访问的关系深度没有限制,所以

$assignments $employee->company->assignments->find_all();

是可能的。记下您希望返回多条记录的find_all();