2010-10-05 66 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();