2015-12-01 4 views
0

У меня есть база данных (= модель) структура типа:Laravel отношения 2 слоя

game: 
    lot (typeof Lot) 
    places (array type of Place) 
     place_id // just a number of a lot in some game 
     user_id 

Что я должен сделать, чтобы позвонить везде так:

User::find(1)->games() // returns Game collection where user has places 

?

Модели:

class Place extends Model 
{ 
    protected $fillable = ['place_id', 'user_id', 'game_id']; 

    public function user() { 
     return $this->belongsTo(User::class); 
    } 

    public function game() { 
     return $this->belongsTo(Game::class); 
    } 
} 

Пользователь:

class User extends Model implements AuthenticatableContract, 
            AuthorizableContract, 
            CanResetPasswordContract 
{ 
    use Authenticatable, Authorizable, CanResetPassword; 

    /** 
    * The database table used by the model. 
    * 
    * @var string 
    */ 
    protected $table = 'users'; 

    /** 
    * The attributes that are mass assignable. 
    * 
    * @var array 
    */ 
    protected $fillable = ['name', 'email', 'steam_id', 'avatar']; 

    /** 
    * The attributes excluded from the model's JSON form. 
    * 
    * @var array 
    */ 
    protected $hidden = ['remember_token']; 

    /** 
    * Get all of the tasks for the user. 
    */ 
    public function items() 
    { 
     return $this->hasMany(SteamItem::class); 
    } 

    public function places() { 
     return $this->hasMany(Place::class); 
    } 
} 

Игра:

class Game extends Model 
{ 
    protected $fillable = ['lot_id']; 

    public function lot() { 
     return $this->belongsTo(Lot::class); 
    } 

    public function places() { 
     return $this->hasMany(Place::class); 
    } 
} 

Теперь я использую этот код в моем классе User:

public function games() { 
    return Game::with(['places' => function ($query) { 
     $query->where('user_id', $this->id); 
    }]);; 
} 

Это не работает, потому что мне нужно сделать это как метод отношений, но метод with возвращает построитель запросов.

В финале я должен позвонить $user->games, и он должен вернуть мне всех пользователей игр, подключенных к месту.

+0

читать с функцией() http://laravel.com/docs/5.1/eloquent-relationships#eager-loading –

+0

Да, я слышал об этом. Но, как я ее узнал, он будет работать только в моем контроллере, и я хочу реализовать его как отношения. Является ли это возможным? – Hiron123

+0

Можете ли вы показать нам свои модели? –

ответ

0

Хорошо. Думаю, теперь я понимаю.

У пользователя много места. Место принадлежит пользователю. Место принадлежит игре. В игре много места.

Вы можете попробовать это:

$user = User::with('places.game.lot')->find(1); 

Это загрузит пользователь и нетерпеливые нагрузки всех отношения. Потому что место belongsTo Игры, которая, в свою очередь, принадлежит к Лоту, вы можете сделать это:

@foreach ($user->places as $place) 
    <img src="{{$place->game->lot->imageUrl}}" /> 
@endforeach 

Кроме того, место на самом деле в сводной таблице, и вы можете воспользоваться many-to-many отношений красноречиво, который я рекомендовал бы читать около.

+0

В этом моя проблема - у ** игры ** нет 'user_id'. Игра 'hasMany' ** места **. И место имеет 'user_id'. И в моей модели пользователя у меня должен быть метод игр (отношений), который вернет мне все, что связано с пользовательскими играми. Узел они связаны через место: D О, черт возьми, у меня болит голова. Pls: D Btw sry для моего английского, это 4 часа здесь. – Hiron123

+0

Эй, я просто попробовал позвонить 'User :: find (1) -> с ('games', 'games.lot', 'games.places')' - это снова возвращает мне коллекцию ** Place **. Мне нужно получить коллекцию ** Game ** items – Hiron123

+0

@ Hiron123 Я отредактировал свой ответ. Если я понимаю это правильно, это решение должно работать на вас. –

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