Eloquent中查找和获取的区别

时间:2014-12-22 07:50:29

标签: laravel eloquent

我创建了3个表:users,roles和role_user。

用户模型:

public function roles()
{
    return $this->belongsToMany('Role');
}

没关系,我可以得到关系

$roles = User::find(1)->roles;

但是当我改变了

$roles = User::where('name', 'Test')->get()->roles;

Undefined property: Illuminate\Database\Eloquent\Collection::$roles

这是错误的,或者找到','其中'有区别吗? 如果我想在哪里使用获取关系,我该怎么办?

2 个答案:

答案 0 :(得分:23)

get()

get()只执行您构建的任何(选择)查询。在任何情况下,它都会返回一个集合Illuminate\Database\Eloquent\Collection)。这是您的错误消息的原因。你想要一个模型的$roles,但是你试图从一个集合中获取它,这显然是不可能的。

find()

find()用于通过其主键获取一个或多个模型。返回值可以是单个模型,也可以是集合,如果找不到记录,则为null

用途

$user = User::find(1); // returns model or null
$users = User::find(array(1, 2, 3)); // returns collection

first()

等效

first()返回第一条记录,因此即使结果可能包含多条记录,您也会得到一个模型

$user = User::where('id', 1)->first();

返回与

相同的内容
$user = User::find(1);

您希望使用first()代替get()

的情况
$roles = User::where('name', 'Test')->first()->roles;

答案 1 :(得分:0)

get返回一个集合,find返回单个模型。很明显,你不能在用户集合上调用->name

User::find(1); // single User model
User::find([1,2,3]); // collection of User models
User::get(); // collection of User models

还有其他方法返回查询结果,例如:

User::first(); // single User model
User::pluck('name'); // single value of name field of the first row

依旧...... read the docs