Kohana 3 ORM关系问题
我已经经历了几个网站(包括这一个),不幸的是作为一个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
这里有几件事我会尝试改变。
首先,为了便于阅读,大多数人在外键中使用下划线。因此,我建议使用entry_id
而不是entryid
(您必须在数据库和代码中进行更改)。
在Kohana 3中,声明'model' => 'companystatus'
在$has_one
中的数组与模型名称相同时是多余的。您可以安全地移除该部分。
但实际上,这些都与您的问题有关,它存在于最后一次ORM调用与您的数据库之间的某处。 (我在这里假设hasbeendeleted
是company
表中的一列,而不是你提到的另外两个表中的任一个。如果情况不是这样,请告诉我。)
如果您正在执行->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) ...
这应该对你有所帮助。发布更多细节,如果你遇到麻烦。
非常感谢,从清洁的角度来看,您的评论非常好。但是,问题是,在将关系设置为我的原始帖子时,我没有收到CompanyStatus或CompanyType记录。这是我的问题。我希望Kohana ORM为我处理这件事,而不是做3个数据库调用(公司,然后是状态和类型记录)。 – Dominik 2011-05-11 03:20:52
@Dominik是否在'Model_CompanyStatus'和'Model_CompanyType'中设置了'$ _has_many'来将它们链接到'Model_Company'? (我假设你试图在状态/类型和公司之间实现一对多关系)。 – Austin 2011-05-11 03:47:32
再次(再次感谢您抽出时间),是的,我在Model_CompanyStatus和Model_CompanyType中有$ _has_many文件。当我调用ORM方法获得单个公司时,是否需要拨打电话以获取关联的公司类型和状态?我曾试过$ company-> companystatus-> find();但是这不会返回基于公司记录的值,它似乎只是获取第一条记录,或者仅显示视图中的第一条记录。 – Dominik 2011-05-12 03:52:39