我正在尝试实现一些简单但在PHP ActiveRecord中似乎不可能的东西。
在我创建的简化示例中,我有两个模型,Person和Exchange,以及两个表people(id, name)
和exchange(id, user_from_id, user_to_id, comment)
。 exchange.user_from_id
和exchange.user_to_id
具有引用people.id
的外键约束。
所以当我运行以下代码时:
$exchange = Exchange::first();
echo $exchange->user_from_id;
echo $exchange->user_from_id->name;
我希望第一个echo
失败,第二个失败。相反,第一个成功并打印出exchange.user_from_id
的时间值,然后显然第二个生成一个"尝试获取非对象的属性"警告。
无论是否向Exchange添加以下内容,结果都是相同的:
static $belongs_to = array(
array('user_from_id', 'class_name' => 'Person'),
array('user_to_id', 'class_name' => 'Person')
);
我应该在代码中进行哪些更改才能使$exchange->user_from_id
返回Person类的实例?
答案 0 :(得分:1)
事实证明我误解了Belongs是如何工作的。我认为它以某种方式将Model的属性(对应于属性)绑定到不同的Model,但我现在意识到它创建了一个新属性,然后您必须使用foreign_key
选项明确地与属性关联。
具体而言,这是我必须添加到Exchange中的内容:
static $belongs_to = array(
array('user_from',
'class_name' => 'Person',
'foreign_key' => 'user_from_id'),
array('user_to',
'class_name' => 'Person',
'foreign_key' => 'user_to_id')
);
然后,使用此代码:
$exchange = Exchange::first();
echo $exchange->user_from;
echo $exchange->user_from->name;
我终于得到了我所期望的:第一个echo
上的致命错误,第二个people.name
people.id = exchange.user_from_id
打印{/ 1}}。
这也使得可以使用以下方法急切加载两个people
对象:
$exchange = Exchange::first(array('include' => array('user_from', 'user_to')));