2014-12-22 2 views
4

Я создал 3 таблицы: пользователи, роли и role_user.Разница найти и получить в Eloquent

модель пользователя:

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

Так что s ome wrong или 'find', 'where' is difference? , если я хочу использовать, где для отношения выборки, как я могу это сделать?

ответ

11

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(); 

возвращает то же самое as

$user = User::find(1); 

Значение для вашего случая вы хотите использовать first() вместо get()

$roles = User::where('name', 'Test')->first()->roles; 
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

Смежные вопросы