(问题上Laracast张贴过,没有透露任何答案,所以我给#1一试)Laravel /雄辩:模型计算数据库字段如何
嗨社区,
我已经解决一个数据库问题,在一个模型中拥有一个可以从不同数据库中读取的字段。由于我在使用英文/ 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]
id
parent_id
kind (house | car | user)
data_id (key into house | car | user table)
...
下一步是“莫名其妙”代码“名”雄辩领域,所以它看起来像它仍然是“树节点”的一部分模型,这是我卡住的地方。我尝试了“计算字段”的模式里面,像文档所描述的,就像这样:
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一个treenode,“name”不包括在内。
和设置“名称”,通过改变一个树节点时,会出现类似问题,如果名字改变,我不得不把它写回到正确的数据库,并且还需要JSON支持。我不知道如何才能做到这一点。我读了关于访问器的信息,比如getNameAttribute和setNameAttribute,但据我所见,只有treenode模型中存在“名称”字段时才能使用。
任何人都可以将我的鼻子指向正确的方向......我可以以某种方式重做我的treenode模型,因此它包含了从其他表中获取其内容的“名称”字段,并且,如果我为其分配值,将名称写入其他表格中,但其他行为与包含在“treenode”模型中时完全相同?
Thx,
Armin。
您使用的是什么版本的Laravel? –
V5.4,对不起,我忘了提。但是我已经看到了你提出的答案,这看起来很有希望。我今晚会试一试,并尽快告诉你结果。同时:谢谢! – Nimral