Kohana 3 ORM关系问题

时间:2011-05-09 05:50:25

标签: php model-view-controller orm kohana

我经历了几个网站(包括这个网站),不幸的是作为一个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

1 个答案:

答案 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}}

之类的事情

那应该对你有所帮助。如果遇到麻烦,请发布更多细节。