无法访问Collection :: $ items

时间:2015-03-01 22:47:15

标签: laravel laravel-4 eloquent

我有一些滔滔不绝的疑问。

用户有很多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

2 个答案:

答案 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();