【发布时间】:2017-09-02 11:50:44
【问题描述】:
(Laracast 上也发布了问题,还没有给出任何答案,所以我试试 Stackoverflow)
大家好,
我必须用一个模型来解决 Eloquent 中的一个数据库问题,该模型有一个要从不同数据库中读取的字段。由于我很难用英语/OOP/Laravel/Eloquent/PHP 术语正确表达我的问题,我将尝试在一个示例中表达我的需求(不太关心正确的 PHP 语法)。
鉴于有一个类似于树状结构的模型,使用的属性通常是:
[treenode]
id
parent_id (=self referencing key to id)
name
...
现在说树是存储指向不同类型节点的指针,比如房屋、汽车和用户,每个节点都存储在不同的表/模型中:
[house]
id
name
street address
zip
...
[car]
id
name
brand
horsepower
...
[user]
id
name
age
gender
...
问题显然是有一个“treenode”模型,它透明地访问其他数据库以填充所有模型共有的“name”字段,以绘制树。
我想过把treenode模型改成:
[treenode]
id
parent_id
kind (house | car | user)
data_id (key into house | car | user table)
...
下一步是在 Eloquent 中“以某种方式”对“名称”字段进行编码,因此它看起来仍然是“树节点”模型的一部分,这就是我被卡住的地方。我在模型中尝试了一个“计算字段”,如文档中所述,如下所示:
public function name() {
select case $this->kind {
case house: return House::findorfail($this->data_id)->first()
case car: return Car::findorfail($this->data_id)->first()
case user: return User::findorfail($this->data_id)->first()
}
}
乍一看这确实有效,但显然“名称”并未真正包含在模型的属性列表中,因此它不会被序列化,即如果我对树节点进行 JSON_encode,则不包含“名称”。
通过更改树节点设置“名称”时也会出现类似的问题,如果要更改名称,我必须将其写回正确的数据库,并且还需要 JSON 支持。我不知道我怎么能做到这一点。我阅读了有关访问器的信息,例如 getNameAttribute 和 setNameAttribute,但据我所知,它们仅在树节点模型中有“名称”字段时才有效。
任何人都可以将我的鼻子指向正确的方向...我可以以某种方式重新设计我的树节点模型,以便它包含一个“名称”字段,该字段从其他表中获取其内容,并且,如果我为其分配一个值,则写入将名称添加到其他表中,但在其他方面的行为与包含在“treenode”模型中时完全相同?
谢谢,
阿明。
【问题讨论】:
-
你使用的是什么版本的 Laravel?
-
V5.4,对不起,我忘了说。但是我已经看到了您提出的答案,这似乎很有希望。今晚我会试一试,尽快让你知道结果。同时:谢谢!
标签: php laravel eloquent field