Laravel 3向中间枢轴工作台

问题描述 投票:1回答:1

使用三向中间数据透视表时,在定义口才模型中的关系时遇到麻烦。

这是我数据库中的4个表:

users
    - id
    - name

instruments
    - id
    - key

instruments_users
    - id
    - user_id
    - instrument_id
    - level_id

levels
    - id
    - key
  • 乐器键可以是:guitarepianotrumpet
  • 级别键可以是:初学者中级专家

每个用户可以演奏1个或更多乐器。对于每种演奏的乐器(关系),我们将级别分配为level_id

我正在尝试为给定用户获取具有相应级别的乐器列表。这是为使用1种工具的用户返回的JSON:

"instruments":[
    {
        "id":1,
        "key":"guitar",
        "pivot":{
            "user_id":1,
            "instrument_id":1,
            "level_id":1
        },
        "level":[
            {
                "id":1,
                "key":"beginner",
                "pivot":{
                    "instrument_id":1,
                    "level_id":1
                }
            }
        ]
    }
]

我的问题是level是一个数组,但我只想将[[one level归因于每个播放的instrument。我相信这是因为我使用了belongsToMany关系,但这是我发现能够通过中间表(instruments_users)的唯一方法。

在Laravel中,我的口才模型配置如下:

User.php

public function instruments() { return $this->belongsToMany( Instrument::class, 'instruments_users' )->withPivot('level_id'); }

Instrument.php

protected $with = ['level']; public function users() { return $this->belongsToMany( User::class, 'instruments_users' )->withPivot('level_id'); } public function level() { return $this->belongsToMany( Level::class, 'instruments_users' ); }

Level.php

public function instruments() { return $this->belongsToMany( Instrument::class, 'instruments_users' ); }
php laravel eloquent pivot
1个回答
0
投票
我认为您最好定义不同类型的关系:

表格和模型:

users >> Model User - id - name instruments >> Model Instrument - id - key instruments_users >> Model InstrumentUser - id - user_id - instrument_id - level_id levels >> Model Level - id - key

模型用户:

function userInstruments() { //One user can have many user_instruments return $this->hasMany(App\InstrumentUser::class); }

模型UserInstrument:

function instrument() { //One user_instrument belongs to one instrument return $this->belongsTo(App\Instrument::class); } function level() { //One user_instrument belongs to one level return $this->belongsTo(App\Level::class); }

通过此设置,您可以通过如下查询获得所需的所有数据:

$user = User::with(['userInstruments.instrument', 'userInstruments.level'])->find($id); $users = User::with(['userInstruments.instrument', 'userInstruments.level'])->get();

输出应该看起来像这样:

//User { "id": 1, "name": "Darth", "user_instruments": [ { "id": 1, "instrument_id": 1, "instrument": { "id": 1, "name": "clarinet", }, "level_id": 1, "level": { "id": "1", "key": "Noob" }, "user_id": 1 } ] }

我希望这会有所帮助。
© www.soinside.com 2019 - 2024. All rights reserved.