我有一些滔滔不绝的疑问。
用户有很多Feed,Feed有很多项目。
我需要按日期获取属于用户订单供稿的所有商品。
我有一个数据透视表:
feed_user
----------
- id
- feed_id
- user_id
和关系在我的模型中定义如下:
class UsersController extends BaseController {
public function feeds() {
return $this->hasMany('feed');
}
class Feed extends \Eloquent {
protected $fillable = [];
public function users() {
return $this->belongsToMany('User');
}
public function items() {
return $this->hasMany('Item');
}
class Item extends \Eloquent {
protected $fillable = [];
public function feed() {
return $this->belongsTo('Feed');
}
但是当我这样做时...
Auth::user()->feeds->items->orderBy('date', 'DESC')->get();
它返回此错误:
Cannot access protected property Illuminate\Database\Eloquent\Collection::$items
答案 0 :(得分:2)
这里有几个问题。
首先,用户模型上的关系不正确。 hasMany关系是一对多的一对多关系。这将假设Feed属于一个用户,并且feed表具有user_id字段。通过在两个模型上添加belongsToMany关系来定义多对多关系。因此,用户属于ToMany供稿,而供应商属于多个用户。
class User extends \Eloquent {
public function feeds() {
return $this->belongsToMany('feed');
}
}
接下来,您看到的错误是因为Auth::user()->feeds
返回Illuminate\Database\Eloquent\Collection
个对象。然后,您尝试访问受保护的items
属性,该属性受到保护并引发您正在看到的错误。
最后,由于Laravel不对关系使用连接,因此您无法通过相关表上的字段对查询进行排序,而无需亲自手动进行连接。
答案 1 :(得分:0)
尝试使用预先加载:
Auth::user()->with('feeds.items')->orderBy('date', 'DESC')->get();