【问题标题】:Model association with custom table and key names与自定义表和键名的模型关联
【发布时间】:2012-12-13 21:28:53
【问题描述】:

我正在使用php.activerecord,我正在尝试链接两个表。

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

contacts的主键叫contactIDcontactCompanyLinks的外键叫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 表中的字段。

当我试图告诉它如何将 2 个表链接在一起时,如何告诉 php.activerecord 停止假设事情并听我说?

【问题讨论】:

  • 你是说当你 var_dump find 结果时它工作得很好。当您将该结果存储在一个变量中并运行contactcompanylinks 函数时会发生什么?我认为 PHP 的工作方式不会改变任何事情,但我遇到了更奇怪的东西。
  • @Jelmer:这是个好主意,但它不会改变任何东西。是的,::find 本身工作正常,但只返回来自contacts 的行。
  • 当您使用要绑定的模型的foreign_key 扩展定义belongs_to 的数组时会发生什么?我从未使用过 ActiveRecord,但我知道在 CakePHP 中您可以定义 foreign_key。它看起来像相同的结构。你试过吗?在这里,我看到他们做类似的事情。 phpactiverecord.org/docs/ActiveRecord/Model
  • @Jelmer:不管我把foreign_key放在哪里,它都不起作用。我尝试了has_manybelongs_to。 =(
  • 我确定您已经仔细检查了这些内容,但是您愿意发布您正在使用的数据库数据吗?包括表名、列名和您正在测试的记录。我想知道,当您简单地运行Contact::find('all'); 时会得到什么?你有什么可能看起来正确的吗? (Ps. 只是想帮助头脑风暴)。我想你已经尝试了很多:)

标签: php phpactiverecord


【解决方案1】:

未定义的属性错误可能来自您的IDphpactiverecord 假定,不强制所有属性为小写。

这意味着所有字段都应该小写。例如,您的密钥应该是 inspectoridcontactid

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

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

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

has_many 也需要相同的字段。 belongs_to 中的primary 是OTHER 表的id,外键是这个表的key(我说key 是指列名)。因为属于外键的是其他表中的键,主键是本表中的键。

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

【讨论】:

  • The field names in the table don't follow any sensible convention, but I can't change it as it would break another app using the same table. 所以你的意思是:他必须改变它?没有这种方法可以通过简单地在绑定数组中设置键来“推翻”它吗?
  • 不!你在哪里读到的? :D 我是说你应该在建立连接的数组中定义它们,因为它们是不同的然后假设:)。并且您应该在代码中的所有调用和定义中将它们设为小写:这并不重要,因为 SQL 对列不区分大小写:这样就不必对字段名称进行任何更改。
  • 这是从 Rocket 的开篇文章中引用的,而不是你的回复 :) 但是好的,现在我明白了。 Tnx :)
  • 老兄!而已!将primary_keyforeign_key 添加到both has_manybelongs_to(并确保名称全部小写)解决了问题!它不再是 NULL :-D
猜你喜欢
  • 1970-01-01
  • 2017-03-15
  • 1970-01-01
  • 1970-01-01
  • 2018-10-02
  • 1970-01-01
  • 1970-01-01
  • 2020-02-03
  • 1970-01-01
相关资源
最近更新 更多