1

我有 3 个相关表,如下部分 -> AgeGroups -> Teams。

我能够获得部分列表并列出每个部分中的所有年龄组和团队。目前,无论年龄组中是否存在任何团队,都会列出所有部分和年龄组。

我希望为此查询添加约束,以便我仅获得包含其中有团队的年龄组的部分列表。例如

  • 列出具有包含团队的年龄组的部分
  • 不会列出没有任何年龄组的部分
  • 不会列出没有任何团队的年龄组

表格列是:

sections:   id | name
agegroups:  id | name  | section_id
teams:      id | name  | agegroup_id 

模型定义如下:

class Section extends Eloquent{
  public function agegroup()
  {
      return $this->hasMany('agegroup');
  }
}

class Agegroup extends Eloquent{
  public function section()
  {
        return $this->belongsTo('section');
  }

  public function team()
  {
        return $this->hasMany('team');
  }
}

class Team extends Eloquent {
  public function agegroup()
  {
    return $this->belongsTo('agegroup');
  } 
}

(出于测试目的)我的 PHP 代码(包括用于预先加载的嵌套关系)位于下面的路由闭包中:

Route::get('/', function()
{
    $sections =  Section::with('agegroup.team')->get();

 foreach ($sections  as $section) {
echo "<h2>$section->name </h2><ul>";

foreach ($section->agegroup as $agegroup) {
    echo "<li>$agegroup->name </li><ul>";

    foreach ($agegroup->team as $team) {
    echo "<li> $team->name </li>";
    }
    echo "</ul>";
 }
 echo "</ul>";
}

});

在测试中,我已经能够为简单的关系添加约束,但我不知道如何为嵌套关系执行此操作。

我希望我已经正确解释了这一点,并感谢您花时间阅读本文并提供任何帮助。

====== 更新 ======

在下面的帮助之后,我有以下代码,这似乎与建议的解决方案相同,禁止在模型中添加 return 语句以返回函数值:

这几乎就在那里 - 正在返回部分(使用 dd($...) 检查)但我收到错误:未定义属性:Illuminate\Database\Eloquent\Collection::$teams

来自 Section Model agegroupsWithTeams() 方法中的 $teams = $this -> agegroups -> teams 行。

有任何想法吗 ?!(谢谢)

// controller/view code
Route::get('/', function()
{
$sections = Section::allWithAgeGroupsWithTeams();

foreach ($sections as $section)
{
    echo $section->name

    foreach ($section->agegroupsWithTeams() as $agegroup)
    {
        echo $agegroup->name;

        foreach ($agegroup->teams as $team)
        {
            echo $team->name;
        }
    }
}
});

// model code 

class Section extends Eloquent
{
public function agegroups()
{
    return $this->hasMany('agegroup');
}

static function allWithAgeGroupsWithTeams()
    {
         $teams = Team::all();
         $agegroups = Agegroup::whereIn('id', $teams->lists('agegroup_id'))->get();
         $sections = Section::whereIn('id', $agegroups->lists('section_id'))->get();             
         return $sections;
    }

    public function agegroupsWithTeams()
    {

        $teams = $this->agegroups;
        return Agegroup::whereIn('id', $teams->lists('agegroup_id'))->get();
    }
}


class Agegroup extends Eloquent
{
public function section()
{
    return $this->belongsTo('section');
}

public function teams()
{
    return $this->hasMany('team');
}
} 

class Team extends Eloquent
{
public function agegroups()
{
    return $this->belongsTo('agegroup');
}
} 
4

2 回答 2

2

我认为你对这一切都是错误的。您所拥有的大部分内容都是正确的,但请尝试一些更清洁的东西。Section.php 内部

class Section
...
    public function nestedgroups()
    {
        return $this->hasMany('Agegroup')->has('teams');
    }

然后你可以简单地获取所有嵌套数据

$sections = Section::has('nestedgroups')->with('agegroups.teams')->get();

这应该适用于 4.1 和 4.0。如果您使用 4.1 和 sqlite 对其进行测试,请确保您在 has() 中转义查询,如下所示:

...::has('nestedgroups', '>', DB::raw(0))->...
于 2014-02-19T20:07:19.693 回答
0

将agegroup() 更新为agegroups(),将team() 更新为team(),然后尝试这样的操作(代码未测试):

<?php

// model classes

class Section extends Eloquent {

    static function allWithAgeGroupsWithTeams()
    {
        $teams = Team::all();

        $agegroups = Agegroup::whereIn('id', $teams->lists('agegroup_id'))->get();

        $sections = Section::whereIn('id', $agegroups->lists('section_id'))->get();
    }

    public function agegroupsWithTeams()
    {
        $teams = $this->agegroups->teams;

        return Agegroup::whereIn('id', $teams->lists('agegroup_id'))->get();
    }

}


?>


<?php

// controller/view code

$sections = Section::allWithAgeGroupsWithTeams();

foreach ($sections as $section)
{
    echo $section->name;

    foreach ($section->agegroupsWithTeams() as $agegroup)
    {
        echo $agegroup->name;

        foreach ($agegroup->teams as $team)
        {
            echo $team->name;
        }
    }

}

?>

http://laravel.com/api/class-Illuminate.Support.Collection.html#_lists http://laravel.com/docs/queries

于 2013-11-04T17:47:26.200 回答