我经历了几个网站(包括这个网站),不幸的是作为一个Kohana新手,我仍然无法让这个工作。数据关系相当简单,我有一个公司记录,应该链接到1个状态记录和1个类型记录。当然,表中会有多家公司,但每家公司只允许链接到每个公司中的一个(并且必须是)。
我拥有的是:
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”作为记录id字段。
现在我加载我的公司记录:
$company = ORM::factory('company')
->where('id', '=', 1)
->where('hasbeendeleted', '=', 0)
->find();
问题是我没有收到公司的公司状态和公司类型属性的任何回复,当我做$ company-&gt; companystatus-&gt; find()时,我得到了第一条记录,这是奇怪的。我错过了什么?
谢谢!
: - )
编辑: 为简单起见,Companies表包含以下字段:
ID (primary key) - auto inc int
CompanyName - varchar(255)
StatusID - int
CompanyTypeID - int
HasBeenDeleted - smallint (0 for false, 1 for true)
DataDictionary表:
EntryID (primary key) - auto inc int
EntryName - nvarchar(255)
公司记录示例:
ID: 1
CompanyName: TestCompany
StatusID: 1
CompanyTypeID: 3
HasBeenDeleted: 0
示例DataDictionary记录:
EntryID: 1
EntryName: Active
EntryID: 2
EntryName: Inactive
EntryID: 3
EntryName: Customer
EntryID: 4
EntryName: Supplier
答案 0 :(得分:0)
我想尝试改变一些事情。
首先,为了便于阅读,大多数人在外键中使用下划线。因此,我建议使用entryid
而不是entry_id
,而不是'model' => 'companystatus'
。您必须在数据库和代码中进行更改。
在Kohana 3中,当密钥与模型名称相同时,在$has_one
数组中声明hasbeendeleted
是多余的。您可以安全地删除该部分。
但实际上,这一切都与您的问题有关,它存在于最后一次ORM调用和您的数据库之间。 (我在这里假设company
是->where('id', '=', 1)
表中的一列,而不是你提到的其他两个表中的一列。如果不是这样,请告诉我。)
如果您与->find()
一起进行hasbeendeleted
,那么您真的希望返回一条公司记录(如果它存在于数据库中)。我建议单独检查$companies
。
说到哪个,而不是命名变量$company
,它应该是单数的(例如ORM::factory('company')->where('id', '=', 1)
),因为它只能保存一个记录。
您可以将ORM::factory('company', 1)
简化为$myCompany = ORM::factory('company', 1);
如果您知道以确保存在数据库ID为1的公司,则以下代码应返回该记录:
if ( ! $myCompany->hasbeendeleted) ...
然后你可以做{{1}}
之类的事情那应该对你有所帮助。如果遇到麻烦,请发布更多细节。