2013-06-20 4 views
1

У меня есть несколько таблиц.Querying 3 tables mysql Laravel

  • Конкурсы
  • Записи
  • Пользователи

Пользователь может подавать заявки на конкурс, пользователь может представить несколько записей на конкурс.

Мне нужно знать электронные письма пользователей, которые отправили запись на конкретный конкурс. Письма находятся в таблице пользователя.

Получение всех записей из конкурса не так сложно, я выполнить это:

$entries = Contest::find(1)->entries()->first(); 

Теперь у меня есть все записи, относящиеся к конкурсу с идентификатором 1 (например, использование). Теперь, как эффективно получить все электронные письма пользователей из таблицы моих пользователей?

Таким образом, три таблицы, которые связаны, я начинаю с идентификатора конкурса, а затем получаю все записи от этого конкурса, а затем должны получить все электронные письма пользователей, которых я еще не смог получить.

Надеюсь, это имеет смысл. Если нет, спросите прочь!

+0

Как насчет [загруженной загрузки] (http://four.laravel.com/docs/eloquent#eager-loading)? Например: 'Contest :: with ('entries.users') -> get() -> first();' –

ответ

1
$getUser = Contest::find(1)->users()->get(); 
$getEmails = $getUser->email; 

foreach($getEmails as $getEmail) 
    echo $getEmail; 

Вы получите весь пользователь emails соответствующий contest идентификатора 1. Но сначала вы должны сделать связь с базой данных в model, чтобы получить эту работу.

+0

Это не работает, потому что я получаю: SQL: SELECT * FROM 'users' WHERE' contest_id '=? И таблица моих пользователей, очевидно, не имеет столбца contest_id. Или я делаю что-то не так? –

2

Вероятно, проще использовать Query Builder в этом случае вместо красноречива:

// Get array of users that submitted entries to contest ID 45 
$users = DB::table('contests AS c') 
    ->join('entries AS e','e.contest_id','=','c.id') 
    ->join('users AS u','e.user_id','=','u.id') 
    ->where('c.id','=',45) // Contest ID 
    ->get(); 

//or get an array of emails: 
$users = DB::table('contests AS c') 
    ->join('entries AS e','e.contest_id','=','c.id') 
    ->join('users AS u','e.user_id','=','u.id') 
    ->where('c.id','=',45) // Contest ID 
    ->lists('email'); 

В Laravel, Красноречивый не всегда лучшее решение для всего. Иногда Query Builder лучше/проще. Eloquent более удобен для простой функциональности и отношений.