为了账号安全,请及时绑定邮箱和手机立即绑定

Laravel Eloquent 通过数据透视表加入

Laravel Eloquent 通过数据透视表加入

PHP
aluckdog 2022-01-24 10:08:59
不幸的是,我还没有太多使用 Eloquent 的经验。我尝试从具有两个数据透视表的三个表中创建一个查询。我的桌子:我的模型:播放器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();我如何另外获取查询中的所有项目?
查看完整描述

3 回答

?
茅侃侃

TA贡献1842条经验 获得超21个赞

你完美地建立了关系。现在从 Player 到 layout 你得到了它with('layout')。试试看。

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

它将为您提供玩家以及带有项目的布局。


查看完整回答
反对 回复 2022-01-24
?
哔哔one

TA贡献1854条经验 获得超8个赞

如果我理解你的问题,我想你就快到了。


也将其添加到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


查看完整回答
反对 回复 2022-01-24
?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

非常感谢您的快速回答。不幸的是,这并不能解决我的问题。我通过 api 路由调用 PlayerController 并需要表单中播放器的所有对象作为返回:

  • 播放器

  • 布局

  • 物品

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"}

但我还需要布局和项目。


我希望你仍然能理解我糟糕的英语。;)


查看完整回答
反对 回复 2022-01-24
  • 3 回答
  • 0 关注
  • 136 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信