Laravel Eloquent 通过数据透视表加入

不幸的是,我还没有太多使用 Eloquent 的经验。我尝试从具有两个数据透视表的三个表中创建一个查询。

我的桌子:

http://img1.mukewang.com/61ee0a550001d2e806680446.jpg

我的模型:


播放器


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');

    }

}

物品


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();

我如何另外获取查询中的所有项目?


aluckdog
浏览 137回答 3
3回答

茅侃侃

你完美地建立了关系。现在从 Player 到 layout 你得到了它with('layout')。试试看。$players = Player::with('layout.item')->where('id',1)->get();它将为您提供玩家以及带有项目的布局。

哔哔one

如果我理解你的问题,我想你就快到了。也将其添加到Player模型中,就像您所做的其他方法一样。public function contents(){&nbsp; &nbsp; 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)&nbsp; &nbsp; <p>{{ $content->text}}</p>@endforeach//get all layouts of a player@foreach($player->layout as $layout)&nbsp; &nbsp; <p>{{ $layout->name}}</p>@endforeach//get all items of a player@foreach($player->layout as $layout)&nbsp; &nbsp; <p>{{ $layout->name}}</p>&nbsp; &nbsp; @foreach($layout->item as $item)&nbsp; &nbsp; &nbsp; &nbsp; <p>{{ $item->name }}</p>&nbsp; &nbsp; @endforeach@endforeach

沧海一幻觉

非常感谢您的快速回答。不幸的是,这并不能解决我的问题。我通过 api 路由调用 PlayerController 并需要表单中播放器的所有对象作为返回:播放器布局物品public function show($id){&nbsp; &nbsp; $player = Player::findOrFail($id);&nbsp; &nbsp; //$player = Player::where('id',$id)->with('layout')->get();&nbsp; &nbsp; return $player;}我得到这个回应:{"id":1,"name":"Testplayer","created_at":"2019-09-22 15:53:07","updated_at":"2019-09-22 15:53:07"}但我还需要布局和项目。我希望你仍然能理解我糟糕的英语。;)
打开App,查看更多内容
随时随地看视频慕课网APP