laravel数据库查询`where`总是需要`first()`?

时间:2014-05-20 05:55:11

标签: laravel eloquent

我是laravel的新手并且对某些查询方法感到困惑。

find($id)很有用并返回一个很好的数组,但有时我需要选择其他字段而不是id

Laravel文档说我可以使用where('field', '=', 'value')并返回一堆数据,这很好。

我无法理解的是为什么我每次都需要添加->first(),即使我非常确定只有一行匹配查询。

3 个答案:

答案 0 :(得分:6)

它是这样的:

$query->where(..)->orderBy(..)->limit(..) etc.
// you can chain the methods as you like, and finally you need one of:

->get($columns); // returns Eloquent Collection of Models or array of stdObjects
->first($columns); // returns single row (Eloquent Model or stdClass)
->find($id); // returns single row (Eloquent Model or stdClass)
->find($ids); // returns Eloquent Collection
// those are examples, there are many more like firstOrFail, findMany etc, check the api

$columns is an array of fields to retrieve, default array('*')
$id is a single primary key value
$ids is an array of PKs, this works in find method only for Eloquent Builder

// or aggregate functions:
->count()
->avg()
->aggregate()
// just examples here too

因此该方法取决于您要检索的内容(数组/集合或单个对象)

返回对象也取决于您使用的构建器(Eloquent Builder或Query Builder):

User::get(); // Eloquent Colleciton
DB::table('users')->get(); // array of stdObjects

答案 1 :(得分:0)

  

即使我非常确定只有一行匹配查询。

Laravel不能读懂你的想法 - 所以你需要告诉它你想做什么。

你可以做任何一次

User::where('field', '=', 'value')->get()

将返回与该搜索匹配的所有对象。有时它可能是一个,但有时它可能是2或3 ......

如果你确定只有一个(或者你只想要第一个),你可以做到

User::where('field', '=', 'value')->first()

答案 2 :(得分:0)

  • get()返回一个对象数组(多行)

,而

  • first()返回单个对象(一行)

当你知道它只返回一行时,你当然可以使用get(),但在解决结果时你需要记住这一点:

  

使用get()

$rez = \DB::table('table')->where('sec_id','=','5')->get();
//will return one row in an array with one item, but will be addressed as:
$myfieldvalue = $rez[0]->fieldname;
  

使用first()

$rez = \DB::table('table')->where('sec_id','=','5')->first();
// will also return one row but without the array, so
$myfieldvalue = $rez->fieldname;

所以这取决于你想如何访问查询结果:作为一个对象或一个数组,还取决于你知道什么"查询将返回。

  • first()相当于SELECT语句末尾的LIMIT 1。即使您的查询将返回多行,如果您使用first(),它将只返回第一行