我正在尝试在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关系正确迭代项目?最佳做法是什么,并从产品表中检索与该项目相关的详细信息
谢谢
答案 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您的人际关系,以减少所运行的查询次数。