2010-10-05 112 views
2

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

编辑:根据要求,这里是有问题的模型。

用户模型

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 
    ) 
} 

回答

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

啊,我看出来:“foreign_key” =>“公司”在Model_User。你不能同时使用外键和关系。 – biakaveron 2010-10-06 05:34:54

0

为了让你的公司会做

$employee->company 

所以,你可以用

$employee->company->property 

得到公司属性来获取你所要说的分配做

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

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

+0

我试过这个,但公司是公司的ID,而不是公司本身。在构建员工模型以获取相关模型时,我需要做什么? – GSto 2010-10-05 20:18:24

+0

@GSto,你可以添加你的Kohana模型到你的文章? – 2010-10-05 21:20:17

+0

@The像素开发,代码已经添加 – GSto 2010-10-06 00:43:16

0

好吧,如果你的员工只能属于一个公司,然后访问该公司将完成,像这样:

$company = $employee->company; 

然后,您可以访问$company属性(字段),就像你使用任何其他型号。

我相信没有限制,你可以访问关系的深度,这样做

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

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