0

Item という名前のデータベース テーブルがあるとします (名前と型を持ちます)。タイプに応じて、項目には追加情報があります。たとえば、ScoredItem の場合、Score があります。そこで、アイテムにスコアを割り当てるデータベース テーブル ItemScore を作成しました。

次に、雄弁なモデル Item (名前とタイプを含む) を作成しましたが、この Score プロパティを追加するにはどうすればよいでしょうか。

明らかな解決策は、モデル ItemScore を作成し、正しいリレーションを設定することです (hasMany と belongsTo を使用)。しかし、スコアしか含まれていないため、これは少しやり過ぎに思えます。

問題は、このモデル クラスを作成せずに、何らかの方法でこの関係を指定して、アイテムのスコア (ある場合) を要求し、データベースに正しく保存されるように設定することは可能ですか?

4

1 に答える 1

0

必要なことはPolymorphic Relationsで行うことができますが、関係について必要な情報を Eloquent に提供するためにモデルを作成する必要があります。Itemあなたが言ったように、あなたが's よりも 's' などの追加情報を持つことができると仮定するとScore、代わりに 's' を持つことができますSubItem

以下に示すように、これらのモデルを定義する必要があります。

class Item extends Eloquent
{
    public function extrainfo()
    {
        return $this->morphTo();
    }
}

class Score extends Eloquent
{
    public function items()
    {
        return $this->morphMany('Item', 'extrainfo');
    }
}

class SubItem extends Eloquent
{
    public function items()
    {
        return $this->morphMany('Item', 'extrainfo');
    }
}

次に、次のようなデータベース構造が作成されます。

items
    id             - integer
    name           - string
    extrainfo_id   - integer
    extrainfo_type - string

scores
    id    - integer
    score - decimal

sub_items
    id   - integer
    name - string

これにより、必要なことは自動的に行われます。あなたがするとき:

$extrainfo = $item->extrainfo;

モデルのextrainfoリレーションは、写真を所有するモデルのタイプに応じて、またはインスタンスItemを返します。そのタイプは、データベース テーブルで定義されます。ScoreSubItem

: これはやり過ぎではありません。Eloquent にリレーションの処理方法を伝えるために提供されるメタ情報であることがわかります。

于 2013-08-31T16:05:31.647 に答える