在Laravel中,哪个Eloquent方法返回数据并返回对象?

时间:2013-01-23 15:03:32

标签: php laravel eloquent

我对Laravel的Eloquent ORM中的各种功能以及它们返回的内容感到困惑。我有一个博客的Post模型 - 如果我写下任何一个,那么我会找回所有帖子的数组:

$posts = Post::all();
$posts = Post::get();
$posts = Post::with('user')->all();

但是,如果我链接其他一些方法,它就不起作用。例如,这会给出一个Unhandled Exception错误:“在Query类中没有定义Method [all]。”

$posts = Post::with('user')->order_by('updated_at', 'desc')->all();

如果我使用paginate函数,我根本不会得到一组结果。

$posts = Post::with('user')->order_by('updated_at', 'desc')->paginate(5);

// index.blade.php
@foreach ($posts as $post)
    {{ $post->id }}
@endforeach

我收到错误:“试图获取非对象的属性”。结果是数据位于$posts->results,而不是$posts

这一切都让人很困惑!我如何理解这个?每个函数返回什么以及如何正确链接它们?

3 个答案:

答案 0 :(得分:5)

没有经过每一种可用的方法,简单的答案是找出输出的数据类型。

dd($whatever);

如果它是一个对象,那么找到该对象是其实例的类,并理解该类的工作原理。

如果它是一个查询对象,你可以链接它,如果它是一个数组,或者你不能。如果它是模型类的实例,那么您可以将其链接,但是您只能调用模型类或派生类中存在的方法。

以下是我写的关于Eloquent和Fluent的简短文章,可能也有帮助:http://laravel.io/topic/17/what-are-fluent-and-eloquent

答案 1 :(得分:1)

当我运行时:

$user = User::where('email','=','test@example.com');
dd($user); --> 'object(Illuminate\Database\Eloquent\Builder)'

// After: 
dd($user->get()); -->   'object(Illuminate\Database\Eloquent\Collection)'

// And finally, to get model object:
dd($user->get()->first()); --> 'object(App\User)'

答案 2 :(得分:-1)

通过窥视源代码,它没有那么糟糕的记录:

https://github.com/laravel/laravel/blob/master/laravel/database/eloquent/query.php#L98

每个方法的phpdoc都有@return,因此您可以立即知道它们应该返回什么。我建议你也阅读docs