【问题标题】:Getting pivot values with far relations in Laravel在 Laravel 中获取具有远关系的枢轴值
【发布时间】:2016-08-18 03:51:43
【问题描述】:

在我的 Laravel 项目中,我使用了以下 (inspired from here) 来获得一个模型与另一个模型的远距离关系。我不能使用 HasManyThrough 方法,因为 barsbazs 与多态关系相关。

public class MyClass 
{
    public function foos()
    {
        return $this->hasMany('App\Foo');
    }

    public function getBazAttribute()
    {
        $this->load(['foos.bars.bazs' => function ($q) use (&$bazs) {
            $bazs = $q->get()->unique();
        }]);
    }
}

这按预期工作并返回与 bars 相关的 bazs,这些 barsfoos 相关,而 foos 与 MyClass 对象。我的问题是我不知道如何使用它来轻松获取以下内容:

  • 每个 baz 相关的特定 foos
  • 每个 baz 相关的 foos 总数

注意:返回的 foos 列表必须是 bazsbarfoos /strong> 通过

【问题讨论】:

    标签: php laravel many-to-many has-many-through


    【解决方案1】:

    我会以一种方式回答这两个问题。

    最简单的方法可能是在 $bazs 集合上加载 foos 并立即加载 - 但以相反的方式加载:

    $bazs->load('bars.foos');
    

    并在baz的模型中定义例如Accessor的方法:

    public function getFoosAttribute()
    {
        $foos = \Illuminate\Database\Eloquent\Collection::make([]);
        foreach ($this->bars as $bar) {
            $foos->merge($bar->foos);
        }
        return $foos;
    }
    

    现在,当您将它们全部加载后,您可以迭代然后以某种方式使用 foos 集合的结果:

    foreach ($bazs as $baz) {
        // get all baz's foos way
        $foosOfBaz = $baz->foos;
    
        //when we have them all in collection we can easily count them
        $foosOfBaz->count() 
    }
    

    返回的 foos 列表必须是 bazs 相关的 foos 到酒吧通过

    如果您想通过特定栏获取与 baz 相关的 foos 您只能通过嵌套的 for/foreach 循环访问,因为关系级别(baz 和它的栏)都在集合中:

    $bazs->load('bars.foos');
    
    foreach ($bazs as $baz) {
        foreach ($baz->bars as $bar) {
            //here You can access the foos collection 
            //that is from bar's that belongs to baz model's object
            $bar->foos;
        }
    }
    

    注意:如果玩具想要得到一个数组,你必须使用:$bar->foos->toArray() 或使用->pluck('filed_name', 'key_name')->toArray() 方法来获得一个简单的列表

    【讨论】:

    • 几乎,我知道这在问题中并不清楚(我现在已经更新),但从与 bar相关的 bazs > 通过 foo 我只想要与 bazs 相关的 foos 列表。
    【解决方案2】:

    您也可以使用外键解决如此长的关系。我在大型项目中经历过很多次。下面我来解释一下:

    一种解决方法是。

    表 A 表 B 表 C 表 D 1个×我 2 由 II 3 c z III

    假设您将表 A 链接到表 B,表 B 链接到表 C,表 C 链接到表 D。

    如果要获取只需要表 A 和 D 且与中间表无关的数据。您可以在 D 中创建直接连接到表 A 的外键关系。

    以下是我的一个长期合作项目的示例。

    在这里,如果您看到如果我需要计算给定用户的所有分数的总和,我需要将其放入排行榜。我不想参加比赛并获得分数。我可以通过向表中添加外键来直接计算。我不认为这是一个坏习惯。正如我通常通过记住前端模型来创建这种关系一样。这将使查询更容易。

    我可能没有给出您需要的解决方案,但您可以使用不同的方法来解决问题。但想分享一个我通常用来解决此类问题的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-05
      • 1970-01-01
      • 2018-03-25
      • 2018-05-16
      • 2019-07-27
      • 2020-08-23
      相关资源
      最近更新 更多