2012-12-13 46 views
2

我正在使用php.activerecord,我试图链接两个表。与自定义表和键名称的模型关联

我有contactscontactCompanyLinks。每个联系人可以在链接表中包含一个或多个行。表中的字段名称不遵循任何明智的约定,但我无法更改它,因为它会使用同一个表破坏另一个应用程序。

contacts的主键被称为contactID,而contactCompanyLinks中的外键被称为inspectorID

php.activerecord造成太多假设,我无法弄清楚如何让它将我的表连接在一起。

这里是我的模型:

Contact.php

<?php 
class Contact extends ActiveRecord\Model { 
    static $primary_key = 'contactID'; 

    static $has_many = array(
     array(
      'contactCompanyLinks', 
      'class_name' => 'ContactCompanyLink', 
      'foreign_key' => 'inspectorID' 
     ) 
    ); 
} 

ContactCompanyLink.php

<?php 
class ContactCompanyLink extends ActiveRecord\Model { 
    static $table_name = 'contactCompanyLinks'; 

    static $belongs_to = array(
     array('contact') 
    ); 
} 

这看起来正确的,但是当我试图让一排,它不工作。我做了以下:

<?php 
var_dump(Contact::find(1234)->contactcompanylinks); 

我打印到屏幕上的所有是NULL!如果我尝试其他属性,如contactcompanylinkContactCompanyLinkContactCompanyLinks,我收到了“未定义的属性”错误。

var_dump(Contact::find(1234)工作得很好。它向我展示了contacts表中的字段。

如何告诉php.activerecord在我试图告诉它如何将两个表连接在一起时停止假设并听取我的意见?

+0

你说的是'var_dump''find'的结果,它工作得很好。将结果存储在变量中并运行“contactcompanylinks”函数后会发生什么?我认为没有什么会因为PHP的工作原理而改变,但我遇到了怪异的东西。 – Jelmer

+0

@Jelmer:这是一个很好的想法,但它不会改变任何事情。而且''find'本身工作正常,但只返回来自'contacts'的行。 –

+0

当你扩展你定义的'belongs_to'与模型的foreign_key绑定的数组时会发生什么?我从来没有使用ActiveRecord,但我知道在CakePHP中可以定义'foreign_key'。它看起来像相同的结构。你尝试过吗?在这里我看到他们做了这样的事情。 http://www.phpactiverecord.org/docs/ActiveRecord/Model – Jelmer

回答

2

未定义的属性错误可能来自您的IDphpactiverecord假设,不然FORCES所有属性都是小写。

这意味着所有字段应该被称为小写字母。 E.G.,你的钥匙应该是inspectoridcontactid

这不是只有列的情况。类名(php类)显然应该是它们实际的情况,并且表名也是如此。

我总是明确定义连接的所有元素以避免这种假设问题。这意味着两个连接将所有的元素对我来说:

static $belongs_to = array(
    array('somename', 
     'foreign_key'=>'someid', 
     'primary_key'=>'id', 
     'class_name'=>'Models\\NameSpace\\YourModelClassName') 
); 

而且还需要为has_many相同的字段。 belongs_to中的主键是OTHER表的ID,外键是此表中的键(当我说键时,我的意思是列名)。对于属于外键的键是在其他表中的键和主键中的键。

另外,请注意命名空间的双斜线。

+0

'表中的字段名称不遵循任何明智的约定,但是我无法更改它,因为它会使用同一张表破坏另一个应用程序。“所以你所说的是:他必须改变它?没有这样的方法,只需在绑定数组中设置键即可“覆盖”它? – Jelmer

+1

不!你在哪里阅读? :D我在说你应该在建立连接的数组中定义它们,因为它们不同于假定的:)。在代码中的所有调用定义中,都应该使它们为小写:这并不重要,因为SQL对列不区分大小写,这种方式不需要对字段名进行更改。 – Nanne

+0

这是来自Rocket的开场白帖子,而不是你的回应:)但没关系,现在我明白了。 Tnx :) – Jelmer