我有一个非常简单的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()
方法在这种情况下以这种方式工作呢?
答案 0 :(得分:2)
get() Eloquent Builder函数将查询作为“select”语句执行。
first() Eloquent Builder函数用于通过其/ primary键获取第一个模型(NOT LIKE SELECT * like get()
)
所以当你做dd($sequent->all())
all() Eloquent Model方法是一个静态方法,它创建查询并调用get()
这就是为什么你不能get()->all(); or all()->get()
你基本上调用get()因此,它会执行select *
声明,然后你会收到回收!
答案 1 :(得分: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()
相同。