如何在PHP ActiveRecord中将属性值作为Model实例获取?

时间:2016-04-01 19:00:42

标签: php activerecord phpactiverecord

我正在尝试实现一些简单但在PHP ActiveRecord中似乎不可能的东西。

在我创建的简化示例中,我有两个模型,Person和Exchange,以及两个表people(id, name)exchange(id, user_from_id, user_to_id, comment)exchange.user_from_idexchange.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类的实例?

1 个答案:

答案 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')));