0

我正在尝试在 laravel 4 中改进我的应用程序中的一些代码,并尝试实现模型之间的关系。

我有一张名为预订的表格,它与物品有一对多的关系。项目与产品具有一对一的关系。基本上作为预订,预订中包含的项目被添加到项目表中。物品的规格来自产品表(类型、价值等)

我在模型中设置了如下关系:

在预订类中:

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');
    }

我现在正在尝试查询日历视图的预订。我正在使用以下方法在一个月内检索所有预订:

$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 your relationship,以减少运行的查询数量。

于 2013-09-14T16:44:58.240 回答