2011-05-09 91 views
2

我已經經歷了幾個網站(包括這一個),不幸的是作爲一個Kohana新手我仍然無法得到這個工作。數據關係非常簡單,我有一個公司記錄,它應該鏈接到1個狀態記錄和1個記錄。當然,表格中會有多家公司,但每家公司只允許與每個公司相關聯(並且必須是)。Kohana 3 ORM關係問題

我所擁有的是:

class Model_Company extends ORM 
{ 
    protected $_has_one = array(
     'companystatus' => array('model' => 'companystatus', 'foreign_key' => 'entryid'), 
     'companytype' => array('model' => 'companytype', 'foreign_key' => 'entryid') 
     , 
    ); 
} 

公司現狀型號:

<?php defined('SYSPATH') or die('No direct access allowed.'); 

class Model_CompanyStatus extends ORM 
    { 
     protected $_table_name = 'datadictionary'; 
     protected $_primary_key = 'entryid'; 

     protected $_has_many = array(
      'company' => array('foreign_key' => 'statusid') 
      , 
     ); 
    } 

?> 

公司類型型號:

<?php defined('SYSPATH') or die('No direct access allowed.'); 

    class Model_CompanyType extends ORM 
    { 
     protected $_table_name = 'datadictionary'; 
     protected $_primary_key = 'entryid'; 

     protected $_has_many = array(
      'company' => array('foreign_key' => 'companytypeid') 
      , 
     ); 
    } 

?> 

的companystatus和companytype模型映射到一個單一的表,有2個字段,entryid和entryname。該表稱爲「datadictionary」,並具有適當的屬性,因此我不必將「id」用作記錄標識字段。

現在我打開我的公司的記錄是這樣的:

$company = ORM::factory('company') 
    ->where('id', '=', 1) 
    ->where('hasbeendeleted', '=', 0) 
    ->find(); 

的問題是,我沒有得到任何東西爲公司的companystatus和companytype屬性,當我做了$公司 - > companystatus-> find()我得到返回的第一條記錄,這很奇怪。我錯過了什麼?

謝謝!

:-)

編輯: 爲了簡便起見,公司表具有以下字段:

ID (primary key) - auto inc int 
CompanyName - varchar(255) 
StatusID - int 
CompanyTypeID - int 
HasBeenDeleted - smallint (0 for false, 1 for true) 

數據字典表:

EntryID (primary key) - auto inc int 
EntryName - nvarchar(255) 

示例公司記錄:

ID: 1 
CompanyName: TestCompany 
StatusID: 1 
CompanyTypeID: 3 
HasBeenDeleted: 0 

實例數據字典記錄:

EntryID: 1 
EntryName: Active 

EntryID: 2 
EntryName: Inactive 

EntryID: 3 
EntryName: Customer 

EntryID: 4 
EntryName: Supplier 

回答

0

這裏有幾件事我會嘗試改變。

首先,爲了便於閱讀,大多數人在外鍵中使用下劃線。因此,我建議使用entry_id而不是entryid(您必須在數據庫和代碼中進行更改)。

在Kohana 3中,聲明'model' => 'companystatus'$has_one中的數組與模型名稱相同時是多餘的。您可以安全地移除該部分。

但實際上,這些都與您的問題有關,它存在於最後一次ORM調用與您的數據庫之間的某處。 (我在這裏假設hasbeendeletedcompany表中的一列,而不是你提到的另外兩個表中的任一個。如果情況不是這樣,請告訴我。)

如果您正在執行->where('id', '=', 1)->find(),那麼您確實希望在數據庫中存在一條公司記錄。我會建議爲hasbeendeleted單獨檢查。

說到這和,而不是命名變量$companies,它應該是單數(例如$company),因爲它只會持有一個記錄。

而且可以簡化ORM::factory('company')->where('id', '=', 1)簡單ORM::factory('company', 1)

如果您知道肯定,隨着1數據庫ID的公司存在,然後將下面的代碼應返回的記錄:

$myCompany = ORM::factory('company', 1);

然後你可以做點像if (! $myCompany->hasbeendeleted) ...

這應該對你有所幫助。發佈更多細節,如果你遇到麻煩。

+0

非常感謝,從清潔的角度來看,您的評論非常好。但是,問題是,在將關係設置爲我的原始帖子時,我沒有收到CompanyStatus或CompanyType記錄。這是我的問題。我希望Kohana ORM爲我處理這件事,而不是做3個數據庫調用(公司,然後是狀態和類型記錄)。 – Dominik 2011-05-11 03:20:52

+0

@Dominik是否在'Model_CompanyStatus'和'Model_CompanyType'中設置了'$ _has_many'來將它們鏈接到'Model_Company'? (我假設你試圖在狀態/類型和公司之間實現一對多關係)。 – Austin 2011-05-11 03:47:32

+0

再次(再次感謝您抽出時間),是的,我在Model_CompanyStatus和Model_CompanyType中有$ _has_many文件。當我調用ORM方法獲得單個公司時,是否需要撥打電話以獲取關聯的公司類型和狀態?我曾試過$ company-> companystatus-> find();但是這不會返回基於公司記錄的值,它似乎只是獲取第一條記錄,或者僅顯示視圖中的第一條記錄。 – Dominik 2011-05-12 03:52:39