如何在 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_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
的垃圾值,然后显然第二个生成了 "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')));
我正在尝试实现一些在 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
的垃圾值,然后显然第二个生成了 "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')));