【问题标题】:Cannot access Collection::$items无法访问 Collection::$items
【发布时间】:2015-03-02 07:34:34
【问题描述】:

我在进行雄辩的查询时遇到了一些麻烦。

用户有很多提要,提要有很多项目。

我需要按日期获取属于用户订单提要的所有商品。

我有一个数据透视表:

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

【问题讨论】:

    标签: laravel laravel-4 eloquent


    【解决方案1】:

    这里有几个问题。

    首先,User模型上的关系不正确。 hasMany 关系是一对多关系的一半。这将假设一个提要属于一个用户,并且提要表具有 user_id 字段。通过在两个模型上添加belongsToMany 关系来定义多对多关系。因此,一个用户属于ToMany feed,一个feed 属于ToMany users。

    class User extends \Eloquent {
        public function feeds() {
            return $this->belongsToMany('feed');
        }
    }
    

    接下来,您看到的错误是因为 Auth::user()->feeds 返回一个 Illuminate\Database\Eloquent\Collection 对象。然后,您尝试访问 Collection 上的 items 属性,该属性受到保护并引发您看到的错误。

    最后,由于 Laravel 不使用连接来建立关系,如果不自己手动进行连接,就无法通过相关表上的字段对查询进行排序。

    【讨论】:

    • 非常感谢!我设法返回一个包含所有提要项目的对象,如下所示: $feeds = Auth::user()->feeds; $contents = 新数组对象; foreach($feeds as $feed) { $items = Item::where('feed_id', $feed->id)->with('Feed')->orderBy('date', 'DESC')->get (); foreach($item as $item){ $contents[] = $item;但我不知道如何按日期对结果进行排序。也许我需要问另一个问题?
    • @vali2009 有一些更简单的方法可以做你想做的事情。我认为你最好提出一个新问题。但是,需要特别注意的是:没有必要像那样查询该项目。在您的 foreach 中,$feed 是一个 Feed 模型,因此您可以通过 $feed->items 访问其项目。
    • 好吧,再次感谢您的帮助,Laravel 和面向对象编码对我来说是新的,所以我不认为这种“快捷方式”。我要问一个新问题,因为我已经尝试对我的大项目的对象返回进行排序,但没有成功。这有点棘手......
    【解决方案2】:

    尝试使用急切加载:

    Auth::user()->with('feeds.items')->orderBy('date', 'DESC')->get();
    

    【讨论】:

    • 感谢@bogdan,但它返回一个新错误:调用未定义的方法 Illuminate\Database\Query\Builder::items()
    • 现在它生成这个 SQL:select * from users order by date desc。我需要按日期而不是用户对项目进行排序,我该怎么办?感谢您的帮助。
    猜你喜欢
    • 2016-08-27
    • 1970-01-01
    • 2014-07-10
    • 2021-04-18
    • 2013-09-25
    • 1970-01-01
    • 2014-04-28
    • 1970-01-01
    • 2021-12-04
    相关资源
    最近更新 更多