【发布时间】:2012-12-27 21:44:22
【问题描述】:
我正在使用php.activerecord,我正在尝试将表格链接在一起。我没有使用 他们的 结构,但 php.activerecord 假设我是,所以它并不总是有效。我正在尝试在已经制作的应用上使用它,所以我无法更改数据库。
我从上一个问题 - Model association with custom table and key names 中了解到,我需要尽可能明确地使用 primary_key 和 foreign_key 字段。
我现在在使用 has_many through 时遇到问题。我不断收到NULL,我不知道为什么。
所以,这是一个场景:我有 3 个表,contacts、contactPrefs 和 preferences。这些表如下
contacts
--------
contactID
name
status
contactPrefs
------------
contactID
prefID
prefValue
preferences
-----------
prefID
name
description
每个contact 有多个contactPrefs。每个contactPrefs 都有一个preferences。我尝试使用has_many 来使其正常工作,但事实并非如此。这是我的模型:
Contacts.php:
<?php
class Contact extends ActiveRecord\Model {
static $primary_key = 'contactID';
static $has_many = array(
array(
'prefs',
'foreign_key' => 'contactid',
'primary_key' => 'contactid',
'class_name' => 'ContactPref'
),
array(
'preferences',
'foreign_key' => 'prefid',
'primary_key' => 'prefid',
'through' => 'prefs',
'class_name' => 'Preference'
)
);
}
ContactPref.php:
<?php
class ContactPref extends ActiveRecord\Model {
static $table_name = 'contactPrefs';
static $belongs_to = array(
array(
'contact',
'foreign_key' => 'contactid',
'primary_key' => 'contactid'
),
array(
'preference',
'foreign_key' => 'prefid',
'primary_key' => 'prefid'
)
);
}
Preference.php:
<?php
class Preference extends ActiveRecord\Model {
static $primary_key = 'prefID';
static $has_many = array(
array(
'prefs',
'foreign_key' => 'prefid',
'primary_key' => 'prefid',
'class_name' => 'ContactPref'
)
);
}
根据the docs,我现在应该能够做到以下几点:
<?php
var_dump(Contact::find(1234)->preference);
我不能。我得到NULL。奇怪的是,我可以这样做:
<?php
var_dump(Contact::find(1234)->prefs[0]->preference);
这工作正常。但是,我不应该能够通过contact 对象直接 访问preference 对象吗?我是否误解了文档(在我看来,它们不是最好的)?我是不是做错了什么?
【问题讨论】:
-
我多次阅读您的问题,您似乎对如何访问属性有一种错觉。 一个 联系人 => 许多 联系人首选项。 一个 联系人首选项 => 一个 偏好。通过这个假设,
Contact::find(1234)导致一个联系人与许多首选项。您不能直接访问preference,您需要知道您指的是他的众多联系偏好中的哪一个。意思是->prefs[index]->preference。这是你已经知道的。您可以做的是为偏好设置一个特定的__get(),这将导致 ->prefs[0]->preference 始终或仅在您定义了一个偏好时。 -
@Khez:我不完全确定如何使用 php.activerecord,我还是新手。
Contact::find(1234)->prefs[0]->preference工作正常,正如您所注意到的,但在 docs 中,您似乎应该能够“直接”访问->preferences。文档不是很好,所以我不确定我的解释是否正确。 -
文档特别说您可以使用
$order->users(用户对象数组),在您的情况下是Contact::finc(1234)->prefs(首选项对象数组)。您可以通过它的索引(在您的示例中为 0)从该数组中选择一个特定的 pref 对象,然后通过执行 prefs[0]->preference 来获得唯一的一对一标识的偏好。对你来说不幸的是,你做的一切都是正确的,你特别想要的是黑客/特殊情况,或者不可能。你希望 Contact::find(1234)->preference 给你一个 Preference 对象数组吗? -
@Khez:事情是
Contact::find(1234)->prefs[0]->preference工作没有though。我试图理解through的意义,但我想我不会。 -
不得不做一些检查,我不确定为什么没有通过作品。可能是因为您给出了明确的外键关系。但!检查Unit Tests 的活动记录,您可以在 test_has_many_through 中查看预期的行为。你实际经历的那个。我将在稍后发布一个关于如何在这种情况下获得不同行为的答案
标签: php phpactiverecord