2016-01-02 8 views
3

У меня есть приложение, которое обрабатывает информацию о пользователе, и одна из частей данных, которую мы собираем, - это то, в какой школе они посещают. У нас есть объект User, объект School и объект UserSchool.Использование отношений в Laravel Eloquent с таблицей моста

Это user_schools стол:

user_id (int),school_id (int)

Со следующими записями например:

100, 20 
200, 500 
200, 10 
300, 10 

Я пытаюсь получить все школы для текущего пользователя (скажем пользователя 200) , Это мой UserSchool объект:

class UserSchool extends Model 
{ 
    var $table = 'user_schools'; 

    function user() { 
     return $this->belongsTo('User'); 
    } 

    function school() { 
     return$this->belongsTo('School'); 
    } 

} 

В User я следующие соотношения определены:

public function schools() 
    { 
     return $this->hasManyThrough('School', 'UserSchool'); 
    } 

    public function userSchools() 
    { 
     return $this->hasMany('UserSchool'); 
    } 

Когда я var_dump($user->schools) я не получаю никаких результатов, хотя я знаю, что это должно быть возвращающих несколько School s. Что я делаю не так? Я уверен, что этого, должно быть, задавали раньше, но я не знаю, каков фактический термин для этого промежуточного типа отношений (таблица таблицы поворота?).

Редактировать: В любом случае, большинство примеров, на которые я смотрел, не сработало. Я также попытался:

public function schools() 
    { 
     return $this->hasManyThrough('School', 'UserSchool', 'school_id'); 
    } 

ответ

4

На самом деле вам не нужно иметь UserSchool объект здесь для этого отношения

Для User модели вы можете использовать создать следующее соотношение:

public function schools() 
{ 
    return $this->belongsToMany(School::class, 'user_schools'); 
} 

И теперь вы можете получить школы пользователей, используя что-то вроде этого:

$user = User::find(1); 
foreach ($user->schools as $school) 
{ 
    echo $school->name; 
} 

Это стандарт many to many relationship

+0

Работал отлично, однако для PHP 5.4 пришлось изменить School :: class на «School». Спасибо. Я бы подумал, что нужно иметь отношения hasManyThrough, поэтому спасибо, что указали мне правильный путь. – StackOverflowed