0

laravel 4 でアプリのコードを改善し、モデル間の関係を実装しようとしています。

アイテムと1対多の関係を持つ予約と呼ばれるテーブルがあります。アイテムは、製品と 1 対 1 の関係にあります。基本的に予約として、予約に含まれるアイテムがアイテム テーブルに追加されます。アイテムの仕様は製品テーブルから取得されます (タイプ、値など)

モデルの関係を次のように設定しました。

予約クラス:

public function item() {
        return $this->hasMany('Item');
    }

項目クラス:

public function reservation() {
        return $this->belongsTo('Reservation');
    }
public function product() {
        return $this->hasOne('Product');
    }

製品クラス:

public function item() {
        return $this->belongsTo('item');
    }

カレンダー ビューの予約を照会しようとしています。以下を使用して、1 か月のすべての予約を取得しています。

$events = Reservation::where('play_date','>=',$start->format('Y-m-d'))
            ->where('play_date','<=', $end->format('Y-m-d'))
            ->get();

次に、次を使用してコレクションを反復処理しようとしています (コレクションですか、それとも結果セットですか?)。

$events->each(function($event) { }

次に、予約のすべての項目を繰り返し処理したいと思いますが、このビットが私を混乱させています。

$items = $event->item()->get();

オブジェクトを作成し、別のコールバックを使用してこのサブコレクションを反復処理できますが、次を使用して製品情報を取得するのに苦労しています:

$item->product()->type

エラーが発生します:

Undefined property: Illuminate\Database\Eloquent\Relations\HasOne::$type 

laravel関係を使用してアイテムを正しく反復処理するにはどうすればよいですか? これのベスト プラクティスは何ですか。製品テーブルからアイテムに関連する詳細を取得します。

ありがとうございました

4

1 に答える 1

3

あなたが望むことをするための主なポイントは、 と の違いを理解すること$event->itemです$event->item()。基本的に$event->itemは と同じ$event->item()->get()です。これを知って、あなたはこのようなことをするべきです

$events = Reservation::where('play_date', '>=', $start->format('Y-m-d'))
                     ->where('play_date', '<=', $end->format('Y-m-d'))
                     ->get();

$events->each(function ($event) {
    $items = $event->item;
    $items->each(function ($item) {
        $type = $item->product->type;
    });
});

実行されるクエリの数を減らすために、リレーションシップのEager Loadingを確認することもできます。

于 2013-09-14T16:44:58.240 に答える