laravel 4一对多关系 - 迭代

时间:2013-09-14 16:11:14

标签: php laravel laravel-4

我正在尝试在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关系正确迭代项目?最佳做法是什么,并从产品表中检索与该项目相关的详细信息

谢谢

1 个答案:

答案 0 :(得分: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您的人际关系,以减少所运行的查询次数。