何时没有或应该在Laravel 5中使用get()

时间:2017-05-16 11:32:06

标签: php laravel laravel-5

我需要了解在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背景,我的代码失败,因为我不知道何时使用()

5 个答案:

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

用于从数据库中获取单个记录