Laravel一起使用find()和get()

时间:2017-07-10 10:59:49

标签: laravel model eloquent

我有一张桌子' tour2s'有2行,当我这样做时:

$tour = Tour2::find(1);
dd($tour);

它返回带有' id' = 1.它的对象。

enter image description here

我想将对象转换为仅包含模型属性的集合,没有别的。我知道当我使用 - > get()时它会返回集合。

但是当我在尝试时:

$tour = Tour2::find(1)->get();
dd($tour);

它返回一个集合但是所有2个游览对象(完整对象,不仅是属性): enter image description here

我这样做了:

   $tour = Tour2::find(1);
   $tour = collect($tour);
   dd($tour);

现在它是我的意思 - 它只返回一组模型属性(我想要的):

enter image description here

所以,我的问题是为什么当我使用$ tour = Tour2 :: find(1) - > get()时,它返回的所有游览不仅仅是' id' = 1?

2 个答案:

答案 0 :(得分:1)

将数组传递给find()将返回一个集合。

$tour = Tour2::find([1]);

但是,它将是Tour2对象的集合,而不仅仅是属性。

然后,如果您只想要属性,可以使用$tour->toArray()

你也可以$tour = collect(Tour2::find(1));

要回答你的问题,当你使用$tour=Tour2::find(1)->get()时,Laravel会获取第一个游览,然后在$tour上调用get()将获取所有其他记录,因此在你的情况下返回两个游览。

答案 1 :(得分:1)

好的,主要问题,据我所知是:“为什么当我写Tour2 :: find(1) - > get()我收到所有记录的集合”。

当你编写Tour2 :: find(1)时,它假定你接收了模型Tour2的实例。所以我们可以简单地写一下$ tourInstanse-> get()

如果您转到\ Illuminate \ Database \ Eloquent \ Model,您可以看到这里没有名为get()的方法,但我们有一个魔术方法public function __call($method, $parameters) { if (in_array($method, ['increment', 'decrement'])) { return $this->$method(...$parameters); } return $this->newQuery()->$method(...$parameters); } 。看看他的实施:

{{1}}

因此,当您在模型实例上调用get()方法时,您将获得模型的QueryBuilder(如上一行所述)并在QueryBuilder上调用get()方法。因此,您将收到该模型类的所有记录。