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

How to get an attribute value as Model instance in PHP ActiveRecord?

我正在尝试实现一些在 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 的垃圾值,然后显然第二个生成了 "Trying to get property of non-object" 警告。

无论是否将以下内容添加到 Exchange,结果都是一样的:

static $belongs_to = array(
    array('user_from_id', 'class_name' => 'Person'),
    array('user_to_id', 'class_name' => 'Person')
);

我应该在我的代码中更改什么才能使 $exchange->user_from_id returns Person class 的实例?

原来我误解了 BelongsTo 的工作原理。我认为它以某种方式将对应于属性的模型的 属性 绑定到另一个模型,但我现在意识到它创建了一个新的 属性,然后您必须使用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.

这也使得使用预先加载两个 people 对象成为可能:

$exchange = Exchange::first(array('include' => array('user_from', 'user_to')));