Laravel Eloquent объединяет сводные таблицы - PullRequest
1 голос
/ 23 сентября 2019

К сожалению, у меня пока нет особого опыта работы с Eloquent.Я пытаюсь создать запрос из трех таблиц, которые имеют две сводные таблицы.

Мои таблицы:

enter image description here

Мои модели:

Player

class Player extends Model
{
    protected $table = 'players';
    protected $fillable = [
        'name'
    ];
    public function layout(){
        return $this->belongsToMany('App\Layout', 'layout_player', 'player_id', 'layout_id');
    }

    public function information(){
        return $this->hasMany('App\Information', 'player_id');
    }
}

Макет

class Layout extends Model
{
    protected $table = 'layouts';
    protected $fillable = [
        'name'
    ];
    public function player(){
        return $this->belongsToMany('App\Player', 'layout_player', 'layout_id', 'player_id');
    }
    public function item(){
        return $this->belongsToMany('App\Item', 'item_layout', 'layout_id', 'item_id');
    }
}

Item

class Item extends Model
{
    protected $table = 'items';
    protected $fillable = [
        'name'
    ];
    public function layout(){
        //return $this->hasOne(Layout::class);
        return $this->belongsToMany('App\Layout', 'item_layout', 'item_id', 'layout_id');
    }
}

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

Я вызываю плеер и раскладки следующим образом:

Player::where('id',1)->with('layout')->get();

Как дополнительно получить все элементы в запросе?

Ответы [ 3 ]

0 голосов
/ 23 сентября 2019

Большое спасибо за быстрый ответ.К сожалению, это не решает мою проблему.Я вызываю PlayerController через API-интерфейс и мне нужны все объекты игрока в форме в качестве возврата:

  • player
  • layout
  • item
public function show($id)
{
    $player = Player::findOrFail($id);
    //$player = Player::where('id',$id)->with('layout')->get();
    return $player;
}

Я получаю этот ответ:

{"id":1,"name":"Testplayer","created_at":"2019-09-22 15:53:07","updated_at":"2019-09-22 15:53:07"}

Но мне нужны также макеты и элементы.

Надеюсь, вы все еще понимаете мой плохой английский.;)

0 голосов
/ 23 сентября 2019

Вы отлично наладили отношения.Теперь из Player в макет вы получаете with('layout').Попробуйте.

$players = Player::with('layout.item')->where('id',1)->get();

Это даст вам игроков вместе с макетами с предметами.

0 голосов
/ 23 сентября 2019

Если я понимаю ваш вопрос, я думаю, что вы почти у цели.

Добавьте это к Player модели, как и другие методы, которые вы сделали.

public function contents(){
    return $this->belongsToMany('App\Content');
}

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

$player = Player::findOrFail(1);
return view('path.to.file_name',compact('player'));

В файле просмотра

//get all contents of a player
@foreach($player->contents as $content)
    <p>{{ $content->text}}</p>
@endforeach

//get all layouts of a player
@foreach($player->layout as $layout)
    <p>{{ $layout->name}}</p>
@endforeach


//get all items of a player
@foreach($player->layout as $layout)
    <p>{{ $layout->name}}</p>
    @foreach($layout->item as $item)
        <p>{{ $item->name }}</p>
    @endforeach
@endforeach
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...