Php 科哈纳3问题
我已经通过几个网站(包括这一个),不幸的是,作为一个科哈纳新手,我仍然无法让这个工作。数据关系相当简单,我有一个公司记录,应该链接到一个状态记录和一个类型记录。当然,表中会有多个公司,但每个公司只允许链接到其中的一个(并且必须是) 我得到的是:Php 科哈纳3问题,php,model-view-controller,orm,kohana,Php,Model View Controller,Orm,Kohana,我已经通过几个网站(包括这一个),不幸的是,作为一个科哈纳新手,我仍然无法让这个工作。数据关系相当简单,我有一个公司记录,应该链接到一个状态记录和一个类型记录。当然,表中会有多个公司,但每个公司只允许链接到其中的一个(并且必须是) 我得到的是: class Model_Company extends ORM { protected $_has_one = array( 'companystatus' => array('model' => 'companyst
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')
,
);
}
?>
问题是,我没有为公司的companystatus和companytype属性返回任何内容,当我执行$company->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
这里有一些事情我会尝试改变 首先,为了可读性,大多数人在外键中使用下划线。因此,我建议不要使用
entryid
,而是使用entry\u id
(您必须在数据库和代码中进行更改)
在Kohana 3中,当密钥与模型名称相同时,在$has\u one
数组中声明'model'=>'companystatus'
是多余的。您可以安全地删除该部分
但实际上,这都是您的问题的附带问题,它存在于最后一次ORM调用和数据库之间。(我在这里假设hasbeendelete
是company
表中的一列,而不是您提到的其他两个表中的任何一个。如果不是这样,请告诉我。)
如果将->where('id','=',1)
与->find()
一起执行,那么您确实希望返回数据库中存在的一个公司记录。我建议单独检查是否已删除
说到这里,与其命名变量$companys
,它实际上应该是单数的(例如$company
),因为它只保存一条记录
您可以将ORM::factory('company')->where('id','=',1)
简化为ORM::factory('company',1)
如果您确定存在数据库ID为1的公司,则以下代码应返回该记录:
$myCompany=ORM::工厂('company',1)代码>
然后,如果(!$myCompany->hasbeendeletted),您可以执行类似于的操作。
那应该对你有点帮助。如果遇到麻烦,请发布更多详细信息。这里有几点我会尝试改变
首先,为了可读性,大多数人在外键中使用下划线。因此,我建议不要使用entryid
,而是使用entry\u id
(您必须在数据库和代码中进行更改)
在Kohana 3中,当密钥与模型名称相同时,在$has\u one
数组中声明'model'=>'companystatus'
是多余的。您可以安全地删除该部分
但实际上,这都是您的问题的附带问题,它存在于最后一次ORM调用和数据库之间。(我在这里假设hasbeendelete
是company
表中的一列,而不是您提到的其他两个表中的任何一个。如果不是这样,请告诉我。)
如果将->where('id','=',1)
与->find()
一起执行,那么您确实希望返回数据库中存在的一个公司记录。我建议单独检查是否已删除
说到这里,与其命名变量$companys
,它实际上应该是单数的(例如$company
),因为它只保存一条记录
您可以将ORM::factory('company')->where('id','=',1)
简化为ORM::factory('company',1)
如果您确定存在数据库ID为1的公司,则以下代码应返回该记录:
$myCompany=ORM::工厂('company',1)代码>
然后,如果(!$myCompany->hasbeendeletted),您可以执行类似于的操作。
那应该对你有点帮助。如果您遇到麻烦,请发布更多详细信息。谢谢,从清洁的角度来看,您的评论非常好。然而,问题是,当我将关系设置为我的原始帖子时,我没有得到CompanyStatus或CompanyType记录。这是我的问题。我希望Kohana ORM能帮我解决这个问题,而不是做3个DB调用(公司,然后是状态和类型记录)。@Dominik你有$吗?你的Model\u CompanyStatus
和Model\u CompanyType
中设置了很多来将它们链接到Model\u company
?(我假设您正在尝试实现状态/类型和公司之间的一对多关系。)您好(再次感谢您抽出时间),是的,我确实在Model_CompanyStatus和Model_CompanyType文件中有$_has_many。当我调用ORM方法获取单个公司时,是否需要调用以获取关联的公司类型和状态?我尝试了$company->companystatus->find();,但是,这不会返回基于公司记录的值,它似乎只是获取第一条记录,或者仅在视图中显示第一条记录。@Dominik Hmmm。。。我必须查看Model\u CompanyStatus
和Model\u CompanyType
的代码(变量,不一定是任何方法),以便在这方面提供进一步的帮助。你能把这个加到你的问题上吗?此外,请更新其中的任何现有代码,以反映您在发布此问题后所做的任何更改。@Dominik我还需要对三个相关数据库表的重要部分(至少是表名、主键和您正在使用的任何其他部分)进行简要说明
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