16

私は現在、laravelを介して多対多の関係を持ついくつかのモデルを持っています。構造は次のとおりです。

users
    id
    username
    ...

games
    id
    title
    ...

game_user
    game_id
    user_id
    system

さて、私のモデルは次のようになります。

<?php

class Game extends Eloquent
{
    /**
     * A game is owned by many users
     *
     * @return mixed
     */
    public function user()
    {
        return $this->belongsToMany('User')->withPivot('system');
    }


<?php

class User extends Eloquent
{
    /**
     * A user has many games.
     *
     * @return mixed
     */
    public function games()
    {
        return $this->belongsToMany('Game')->withPivot('system');
    }

これで、すべて正常に動作します。ただし、ピボット テーブルのシステム フィールドでミューテーターを使用したいと考えています。これに関するドキュメントが見つからず、次の (ユーザー モデルとゲーム モデルの両方で) は機能しません。

public function getSystemAttribute($val)
{
    return $val.' Testing';
}
4

5 に答える 5

2

この質問は興味深いと思ったので、コードをいじり始めました。

特定のエントリにアクセスする必要がある場合、私の解決策は次のとおりです。

public function getSystemAttribute($game){
    foreach($this->games as $value){
        if($value->id==$game->id){
            $value->pivot->system = 'foo';
            $value->pivot->save();
        }
    }
}

次のように簡単に呼び出すことができます。

$user->getSystemAttribute($game)

アクセサーに関しては、コレクションをイタレートせずに他の方法を見つけることができませんでした。コレクションを反復するもっときれいな方法がありますが、これはこの質問の範囲ではありませんでした。ドキュメントから、ピボット テーブルの任意の属性にアクセスする方法を確認できます。

お役に立てれば

于 2013-11-14T14:21:47.587 に答える
1

system変更した属性をレスポンス (JSON など) に挿入できるようにしたい場合は、両方のモデル (ゲーム + ユーザー) に以下を追加する必要があります。

protected $appends = array('system');
于 2013-11-16T23:37:47.153 に答える