Laravel自定义透视使用(扩展模型或扩展透视)

时间:2016-04-30 19:17:13

标签: php laravel eloquent pivot-table laravel-5.2

我真的很难使用自定义模型作为我的支点,并且不明白为什么我们可以为它制作自定义模型,如果我们不能将它用作模型。 我已经看过很多答案和文章,所有人都选择扩展Pivot或Model,但是现实生活中的用法从未被考虑过,而且从来没有比给它一个“命名”类更进一步。

这是我想要实现的一个例子: 我的主要型号: 播放器模型,包含 播放器 表。 游戏型号,带 游戏 表。

播放器游戏有多对多的关系,我们称之为“派对”并带有“ < em> game_player “table。

现在不太重要,我还有一个得分模型可以保持得分/转弯,派对可以有很多分数,所以 得分 表有一个party_id条目。

所以,这里基本上是我的课程(Laravel 5.2):

播放器

class Player extends Model
{
    // The Games this Player is participating to.
    public function games() {
        return $this->belongsToMany(Game::class)->withPivot('id')->withTimestamps();
    }

    // The Scores belonging to this Player.
    public function parties() {
        return $this->hasManyThrough(Score::class, Party::class);
    }

    // The Custom Pivot (Party) creation for this Player.
    public function newPivot(Model $parent, array $attributes, $table, $exists) {
        if ($parent instanceof Game) {
            return new Party($parent, $attributes, $table, $exists);
        }
        return parent::newPivot($parent, $attributes, $table, $exists);
    }
}

游戏

class Game extends Model
{
    // The Players participating into this Game.
    public function players() {
        return $this->belongsToMany(Player::class)->withPivot('id')->withTimestamps();
    }

    // The Scores belonging to this Party.
    public function parties() {
        return $this->hasManyThrough(Score::class, Party::class);
    }

    // The Custom Pivot (Party) creation for this Game.
    public function newPivot(Model $parent, array $attributes, $table, $exists) {
        if ($parent instanceof Player) {
            return new Party($parent, $attributes, $table, $exists);
        }
        return parent::newPivot($parent, $attributes, $table, $exists);
    }
}

class Party extends Pivot
{
    protected $table = 'game_player';

    // The Player this Party belongs to.
    public function player() {
        return $this->belongsTo(Player::class);
    }

    // The Game this Party belongs to.
    public function event() {
        return $this->belongsTo(Game::class);
    }

    // The Scores belonging to this Party.
    public function scores()
    {
        return $this->hasMany(Score::class);
    }
}

得分

class Score extends Model
{
    // The Party this Score belongs to (has "party_id" column).
    public function party() {
        return $this->belongsTo(Party::class);
    }
}

现在,我有两组不同的问题出现,具体取决于我是否在Party上扩展Model或Pivot:

1)当Party延伸Pivot时:

  • 无法执行类似 Party :: count()的任何操作。
  • 不能做像 Party :: where(“player_id”,$ player-&gt; id)之类的东西......基本上我希望派对有得分/转牌表附加到它并且这样做我需要选择枢轴模型。
  • 无法执行类似$ events-&gt; player-&gt; first() - &gt;得分()或事件$ events-&gt; player-&gt; first() - &gt; pivot-&gt;得分( ),它打破了以下内容:
  

PHP错误:传递给Illuminate \ Database \ Eloquent \ Relations \ Pivot :: __ construct()的参数1必须是Illuminate \ Database \ Eloquent \ Model

的实例

2)当Party扩展Model:

  • 可以做一些琐碎的事情,比如Party :: count(),Party :: where(“Game_id”,$ game-&gt; id)
  • 失去所有支点功能,所以不能做$ game-&gt;玩家,甚至不玩$ game-&gt;玩家()工作:$ game-&gt; players() - &gt; count()是正确的,但是$ game-&gt; players() - &gt; first()或$ game-&gt; players-&gt; first()将突破以下内容:
  

PHP错误:传递给Illuminate \ Database \ Eloquent \ Model :: __ construct()的参数1必须是类型数组,给定对象

问题:

如何在实例化它们时正确使用自定义枢轴模型?

我希望实现以下目标:

  • 执行正常的$ events-&gt; players-&gt; attach($ player)
  • 能够附加分数,如$ score-&gt; party_id = $ events-&gt; players-&gt; find($ x) - &gt; pivot-&gt; id(或通过范围的任何其他方式)
  • 能够计算正在玩的所有各方,或某个特定游戏或特定玩家的玩家(例如Party :: count(),$ player-&gt; parties-&gt; count()等)

谢谢。

1 个答案:

答案 0 :(得分:0)

对于我 - - 使用laravel的经验我发现当pivot tables关联时many-to-many使用了one-to-many 仅在表A中的特定对象与表B之间保留一个链接。例如,具有角色的用户。

由于您可以成像,因此用户A只需要与角色B建立一个链接/关系。 但是,如果我们想要使用需要在userA和productB之间保留不同记录的数据透视表(例如Sales),会发生什么?我还没有找到直接的方法来做到这一点。

我的解决方案是将intermadiate表视为实际模型,然后与两个表(用户 - 销售和产品 - 销售)建立一对多的关系,然后,如果我需要,将此中间模型与另一个模型相关联。

所以在你的情况下,我有4个明确的模型:

  • 播放器 | one-to-many派对
  • 游戏 | one-to-one派对
  • 派对 | many-to-one 得分 | many-to-one派对 |使用播放器
  • one-to-one
  • 得分 | $( "div:visible" ).click(function() { console.log($( this )); }); 派对

使用这种方法,您还可以更好地控制每个模型的属性。