Laravel Eloquent查询行为奇怪

问题描述 投票:1回答:2

我有一个非常简单的Eloquent查询如下

$sequent = EmailSequence::select('subject_line','message_body')->where('id',$id)->first();

如果我然后dd($sequent)我得到以下数据库中的一行按预期。

EmailSequence {#492 ▼
  #table: "email_sequence"
  #primaryKey: "id"
  ...
  #attributes: array:2 [▼
    "subject_line" => "Re: Email Sequence Test"
    "message_body" => "<p>Hi paul testing 2</p>"
  ]
  #original: array:2 [▶]

这是我所期望的,但如果相反我做dd($sequent->all())它给出了数据库中所有行的集合,即使id和其他一切都不同。

Collection {#490 ▼
  #items: array:3 [▼
    0 => EmailSequence {#478 ▶}
    1 => EmailSequence {#488 ▶}
    2 => EmailSequence {#486 ▶}
  ]
}

我在这做了什么?为什么Eloquent会返回所有行?

编辑。好吧,我刚刚意识到我不需要使用first()方法,因为id是唯一的。使用get()只能正确返回单行。那么为什么first()方法在这种情况下以这种方式工作呢?

laravel eloquent
2个回答
0
投票

get()将始终返回包含结果的Collection。即使只有一个结果,它也会在Collection中。

first()get(),但随后从结果Collection返回第一项。当您知道查询条件将导致一条记录,或者您只关心结果中的第一条记录时,first()就是您要使用的。

当使用主键搜索时,通常使用find($id)方法。这是where('id', $id)->first()的捷径。因此,您的原始声明可以重写为

$sequent = EmailSequence::select('subject_line','message_body')->find($id);

您使用all()的问题是由于对Eloquent实施的ActiveRecord模式的误解。每个模型实例都具有用于查询数据库和检索模型实例的所有函数。所以,当你做$sequent->all()时,真正发生的是新的查询启动,并返回整个表中的所有记录。在这种情况下,$sequent->all()EmailSequence::all()相同。

您还可以阅读我的答案herehere作为补充信息。


2
投票

get()Eloquent Builder函数将查询作为“select”语句执行。

first()Eloquent Builder函数用于通过其/ primary键获取第一个模型(NOT LIKE SELECT *像get()那样)

所以,当你做dd($sequent->all())

all()Eloquent Model方法是一个静态方法,它创建查询并调用get()这就是为什么你不能做get()->all(); or all()->get()你基本上在引擎盖下调用get()因此它执行一个select *语句然后你得到一个集合!

© www.soinside.com 2019 - 2024. All rights reserved.