【问题标题】:Get data through pivot table in Laravel通过 Laravel 中的数据透视表获取数据
【发布时间】:2020-09-30 07:20:48
【问题描述】:

我有 3 张桌子。表 1 和表 2 将它们的 id 作为第三个(枢轴)中的外键。

第一个的关系是

$this->hasMany("App\Pivot","game_id");

,第二个是

$this->belongsToMany("App\Pivot","army_id");

pivot 与它们都有关系,即belongsTo

我的架构:

我尝试在第一个控制器中访问它,如下所示:

$games= Game::with("armies")->get();

我得到的结果是一系列游戏,而不是个人军队数据,我从数据透视表中获取集合。

我可以循环遍历它并以这种方式获得它,有没有更优雅的方法呢?

【问题讨论】:

    标签: laravel pivot


    【解决方案1】:

    如果您使用的是数据透视表,这就是这样做的方法。

    游戏模型

    public function armies()
    {
        return $this->belongsToMany(App\Armies::class, 'pivot_table', 'game_id', 'army_id');
    }
    

    军队模型

    public function armies()
    {
        return $this->belongsToMany(App\Games::class, 'pivot_table', 'army_id', 'game_id');
    }
    

    像这样访问关系..

    控制器

    App\Games::first()->armies()->get();
    or
    App\Games::first()->armies
    or
    App\Games::find(1)->armies
    

    【讨论】:

    • 它有效。我正在使用$games = Game::with("armies")->get();。我只想问你几个跟进。在军队数组中,奇异对象具有属性枢轴。它是关系的副产品还是可移除的?第二:如果我从你写的第一个中删除'army_id',它会显示与它完全相同的数据。这是为什么呢?
    【解决方案2】:

    如果您要使用这样的中间表,我可能会这样做:

    游戏模型

        public function armies()
        {
            return $this->belongsToMany('App\Armies');
        }
    
    

    军队模型

        public function games()
        {
            return $this->belongsToMany('App\Games');
        }
    

    我会保持表结构不变,但将“pivot”表重命名为 armies_games,因为这是 Laravel 默认查找的内容。如果您希望将其命名为 Pivots,则需要将其作为 belongsToMany 中的第二个参数传入。

    有了这个,你真的不需要 Pivot 模型,你应该能够做到:

    $armies = Game::first()->armies()->get();
    

    $armies = Game::find(3)->armies()->orderBy('name')->get();
    

    $game = Game::first();
    foreach ($game->armies as $army) {
      //
    }
    

    等等

    【讨论】:

    • 不太适用。我不“知道”提前 id。分别为所有“游戏”加上它。我说我正在尝试避免循环并搜索更多“laravel 方式”。
    • 我在 10 分钟后发布的答案准确地解释了我几乎逐字解释的内容。我很好奇为什么我的“不适用”但另一个被接受了?
    • 因为我的数据透视表被称为“pivot”,而不是标准的 Laravel 命名,即“army_game”。这是我的错。不知道数据透视表命名对流。如果它是标准命名的,你会工作。
    猜你喜欢
    • 2021-09-10
    • 2018-06-08
    • 2017-06-21
    • 1970-01-01
    • 1970-01-01
    • 2019-07-25
    • 1970-01-01
    • 2017-10-16
    • 1970-01-01
    相关资源
    最近更新 更多