我对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
。
这一切都让人很困惑!我如何理解这个?每个函数返回什么以及如何正确链接它们?
答案 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。