2016-01-06 5 views
2

я пытаюсь реализовать SQL запроса наLaravel красноречивых отношений hasmany запрос

select * from user,comments where comments.user_id= user.id 

так я создать getcomments метод на моей модели пользователя с помощью следующего кода

public function comments(){return $this->hasMany('Comments')} 

и теперь я, обращающегося к данные по

$data = User::find(1)->comments; 

но это дало мне данные только из таблицы комментариев (не пользователь и комментарии) как я могу это сделать

ответ

1

Сначала найдите пользователя. Затем получите доступ ко всем пользовательским данным и ко всем комментариям пользователя.

$data = User::find(1); 
//or you can use eager loading for more performance. thanks for @Özgür Adem Işıklı 
$data = User::with('comments')->find(1); 

//access user data 
$data->id; 
$data->email; //etc. 

//user's comments: 
foreach($data->comments as $comment) { 
    //access comment detail 
    $comment->id; 
    $comment->title; 
} 
1

Выбирают только комментарии пользователя, которые вы выбрали по id. Вы должны это сделать;

User::find(1)->with('comments')->get(); 
+0

Он должен работать без активной загрузки. – kotapeter

+0

Почему он должен работать без активной загрузки? Можете ли вы дать мне более подробную информацию? –

+0

Яркая загрузка - это только решение для производительности. Он загружает все комментарии, когда вы находите пользователя. Если вы не используете загружаемую загрузку, комментарии будут загружаться при вводе: $ data-> comments. Ваше решение в порядке, но оно должно работать без активной загрузки. – kotapeter

3

Eloquent ORM следует за образцом активной записи. Это немного другой способ подумать о моделировании и взаимодействии с вашими данными, когда вы пришли от написания чистых операторов sql.

Настройка отношений комментариев - хороший шаг. Теперь вам нужно подумать о том, как вы взаимодействуете с вашими данными.

Вы можете получить всю информацию следующим утверждением:

$user = User::with('comments')->find(1); 

С этим утверждением, вся информация пользователя загружается в $user объект, и вся информация комментария загружается в $user->comments Collection атрибут. Эта информация может быть доступна как так:

// get the info 
$user = User::with('comments')->find(1); 

// display some user info 
echo $user->first_name; 
echo $user->last_name; 

// loop through the comment Collection 
foreach($user->comments as $comment) { 
    // display some comment info 
    echo $comment->text; 
} 

with('comments') раздел рассказывает запрос на нетерпеливые нагрузки всех комментарии для возвращенных пользователей (в данном случае, только один с идентификатором 1). Если вы не захотите их загрузить, они будут автоматически загружаться, когда вы попытаетесь получить к ним доступ. Вышеприведенный код будет работать точно так же без with('comments'). Желательная загрузка становится более важной, если вы загружаете несколько родительских записей, а не только одну, поскольку она решает проблему N + 1. Вы можете прочитать о eager loading here.

Внимание (причина, я добавил новый ответ):

User::find(1)->with('comments')->get();, иначе предложил, не собирается предоставлять информацию, которую вы ищете. На самом деле это приведет к возврату всех ваших пользователей с их загруженными комментариями. Вот почему:

Во-первых, User::find(1) собирается вернуть одного пользователя с идентификатором 1, что хорошо. Тем не менее, он затем вызывает with('comments') на этой модели, которая фактически создает новый экземпляр построителя запросов для таблицы users. Наконец, он вызывает get() в этом новом экземпляре builder запроса, и поскольку он не имеет каких-либо ограничений на него, он вернет всех пользователей в таблице, причем все комментарии, прикрепленные к этим пользователям, будут загружены.

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