(質問は、あまりにもLaracastに掲載まだ答えを明らかにしなかったので、私はStackOverflowのを試してみる)Laravel /雄弁:モデルで計算され、データベースのフィールドどの
こんにちはコミュニティ、私が解決しなければならない
さまざまなデータベースから読み込まれるフィールドを持つモデルを持つ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モデルを変更することについて考えた:
[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のサポートも必要になりますので、treenodeを変更して「名前」を設定すると同様の問題が発生します。私はこれをどのように達成できるかという手がかりはありません。 getNameAttributeやsetNameAttributeのようなアクセサについては読んでいますが、私が見た限りでは、treenodeモデルに "name"フィールドがある場合にのみ動作します。
私の鼻を正しい方向に向けることができます...私は何とか私のtreenodeモデルを再加工して、他のテーブルからその内容を取得する「名前」フィールドを必要とすることができます。その名前を他のテーブルに書き出しますが、そうでなければ「treenode」モデルに含まれていたときとまったく同じように動作します。
thx、
アルミン。
Laravelのどのバージョンをお使いですか? –
V5.4、申し訳ありませんが、私は言及するのを忘れました。しかし、私はすでにあなたの提案された答えを見ました、そして、これは本当に有望なようです。私は今夜それを試してみましょう、あなたができるだけ早く結果について知ってみましょう。その間に:ありがとう! – Nimral