我有一个非常简单的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()
方法在这种情况下以这种方式工作呢?
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()
相同。
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 *
语句然后你得到一个集合!