Laravel Eloquent查询行为奇怪

时间:2018-01-15 22:06:41

标签: laravel eloquent

我有一个非常简单的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()方法在这种情况下以这种方式工作呢?

2 个答案:

答案 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()相同。

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