在Laravel中获得具有远关系的透视值

时间:2016-04-24 21:17:08

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

在我的Laravel项目中,我使用了以下(inspired from here)来获得从模型到另一个模型的远程关系。我无法使用HasManyThrough方法,因为 bar bazs 与多态关系相关。

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();
        }]);
    }
}

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

  • baz 所涉及的具体 foos
  • 每个 baz
  • 相关的 foos 总数

注意: foos 列表必须是 foos bazs 栏<相关< / strong>通过

2 个答案:

答案 0 :(得分:0)

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

最简单的方法可能是加载foos并加载 - 但以对立的方式 - 加载$bazs集合:

$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循环访问,因为两个关系级别(bazs和it&#39; s bars)都在集合中:

$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()方法获取简单列表

答案 1 :(得分:0)

您也可以使用外键来解决这种长关系问题。我在很多项目中经历过这么多次。让我解释一下:

解决问题的一种方法是。

Table A    Table B    Table C    Table D
  1           a          x         I 
  2           b          y         II
  3           c          z         III

我们在这里说你有一个表A链接到表B,表B链接到表C,表C链接到表D.

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

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

This is one of my project that had long relationship 在这里,如果您看到我是否需要计算给定用户的所有分数的总和,我需要将其放在排行榜中。我不想通过锦标赛获得分数。我可以通过向表中添加外键来直接计算。我不认为这是一个不好的做法。正如我通常通过保持前端模型在我脑海中创造这样的关系。这将使查询更容易。

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