2011-05-09 103 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