3

オブジェクト データを格納するために EAV 構造を使用するシステムに取り組んでいます。モデル自体には、いくつかの事前定義された属性 (座標と日付/時刻スタンプ) があります。つまり、次のとおりです。

  • バツ
  • Z
  • 開始日時
  • 終了日時

残りの属性はユーザーによって動的に作成され、属性テーブルに行として追加されます。これらの行はピボットされ、値の表に合わせて列として使用されます (これに説明が必要かどうかはわかりませんでしたが、申し訳ありませんが安全だと判断しました)。

オブジェクト (またはエンティティ) と属性の関係は 1 対多です。

属性と値の関係は 1 対多です。

私は Eloquent/Laravel を初めて使用しますが、リレーションシップのドキュメントを読み、1 対多のリレーションシップの機能があることを確認しましたが、EAV 内のすべてのデータを参照する方法がわかりません (RDBMS 向けのようです) )。このようなものでしょうか (これは大雑把な例であることに注意してください)。

class UserObject extends Eloquent {

    public function object_data()
    {
        return $this->hasMany(attributes_data);
    }

    public function attributes_data()
    {
        return $this->hasMany('Values');
    }

}

基本的に、私の質問は次のとおりです。

EAV に関連付けられたすべてのデータを取得するときにモデルを設計/作成するための受け入れられた (または適切な) アプローチはありますか? もしそうなら、Eloquent/EAV アプローチのドキュメントやチュートリアルを教えてもらえますか?

考えた後のいくつか:

私の考えでは、EAV のコンポーネントごとに 3 つのクラスを作成する必要があると考えていました (つまり、エンティティ コンポーネント データ用に 1 つ、属性データ用に 1 つ、値データ用に 1 つ)。

ありがとうございました。

4

1 に答える 1

6

これに対処するために実行できるいくつかのアプローチがあります (他のフォーラムの投稿で発見したように):

疑似コードなど、各 EAV コンポーネントのモデルを作成します。

class Object extends Eloquent{
    public function objects(){
        return $this->hasMany('Attribute');
    }
}

class Attribute extends Eloquent{
    public function attributes(){
        return $this->hasMany('Value');
    }
}

class Value extends Eloquent{
    public function values(){
        return /* etc. */;
    }
}

これにより、値データを取得するためだけに 3 つのクエリが実行されるため、パフォーマンスが低下します。

クエリ ビルダーを使用する

select()->join()->where("属性", "=", "何か")

これにより、パフォーマンス ヒットも発生します。

LaravelのDB機能

基本的に、SQL クエリを直接実行すると、オーバーヘッドが最小になる可能性があります。Laravel サイトの例:

 $results = DB::select('select * from users where id = ?', array(1));

サイドノート:

この種のシステム (属性が動的で未知のもの) では、EAV を完全に避けて、Laravel での作業がより直感的な No-SQL ソリューションに固執するのが最善です。私はこのオプションを検討しており、長期的にはこれを使用します。

于 2013-06-20T19:25:54.897 に答える