我需要了解在Laravel 5中何时/不使用get();
。
PHP警告:缺少Illuminate \ Support \ Collection :: get()
的参数1
Google shows me answers他们的问题,但没有人真正解释你何时应该/不使用它。
示例:
App\User::first()->timesheets->where('is_completed', true)->get(); // error
App\Timesheet::where('is_completed', true)->get(); // no error
修正:
App\User::first()->timesheets()->where('is_completed', true)->get(); // no error
注意时间表()而不是时间表?我可以详细解释发生了什么吗?
我来自Ruby背景,我的代码失败,因为我不知道何时使用()
。
答案 0 :(得分:5)
我会尝试尽可能地描述这个,在属性返回构建器的实例后,这个()
符号,让我们以关系为例,
假设您拥有与User
具有一对多关系的Posts
模型,
如果你这样做:
$user = App\User::first();
$user->posts();
这里会返回一个关系实例,因为你附加了()
,现在应该何时追加()
?每当你想要链其他方法时,你应该这样做,例如:
$user->posts()->where('some query here')->first();
现在我将有一个我想要的项目。
如果我需要说所有帖子,我可以这样做:
$user->posts;
或者
$user->posts()->latest()->get();
$user->posts()->all()->get();
所以关键是,每当你想将方法链接到一个雄辩的查询时使用()
,如果你只想直接检索记录或访问这些记录的属性,那么就这样做:
$user->posts->title;
答案 1 :(得分:3)
好吧,->timesheet
会返回一个集合,其中->timesheet()
会返回一个构建器
在收藏中,您可以使用->where()
和->get('fieldname')
,但不能使用->get()
但->get()
方法可以在构建器上使用,但这将返回基于构建器的集合。
希望这有帮助。
答案 2 :(得分:0)
使用->timesheets
时,您正在访问一个变量,该变量返回它的值(在本例中是Collection的一个实例)。
当您使用->timesheets()
时,您正在调用分配给变量的任何内容,在这种情况下返回一个Builder实例。
尽管pascalvgemert的回答确实回答了有关Laravel的问题,但它没有解释访问或调用变量之间的区别。
答案 3 :(得分:0)
您遇到的“问题”是由于能够query relations
的特点访问属性->timesheets
之类的关系时,会执行关系中定义的查询,并返回结果(以Collection
的形式)。
当像方法->timesheets()
一样访问它时,将返回查询构建器而不是结果集合,允许您根据需要修改查询。由于它是Builder
对象,因此您需要调用get()
来获取实际结果,这在第一种情况下是不需要的。
答案 4 :(得分:-1)
简单来说
$user = App\User::get();
用于从数据库中获取多个数据
,而
$user = App\User::first();
用于从数据库中获取单个记录