在一个层次上结合多关系查询

时间:2015-05-29 11:32:58

标签: php mysql laravel laravel-4 has-and-belongs-to-many

我有2个表: - itemsgroups

groups表格如下: -

create table groups (`id` int unsigned not null auto_increment, 
                     `group_name` varchar(255), 
                      primary key(`id`)
);

items表格如下: -

create table items (`id` int unsigned not null auto_increment, 
                    `group_for` int unsigned not null, 
                    `item_name` varchar(255), 
                     primary key(`id`), 
                     key `group_for` (`group_for`), 
                     constraint `fk_group_for` foreign key (`group_for`)                  
                     references `groups`(`id`)

我有以下两种雄辩的方法: -

class Item extends \Eloquent {

    // Add your validation rules here
    public static $rules = [
        // No rules
    ];

    // Don't forget to fill this array
    protected $fillable = ['group_for', 'item_name'];


    public function divGet() {
        return $this->belongsTo('group', 'group_for', 'id');
    }
}

集体雄辩

class Group extends \Eloquent {

    // Add your validation rules here
    public static $rules = [
        // No Rules.
    ];

    // Don't forget to fill this array
    protected $fillable = ['group_name'];

    public function items() {
        return $this->hasMany('item', 'group_for', 'id');
    }
}

现在,我在查询下运行: -

$groupItem = array()

// Fetching all group row
$gGroup = Group::all();

// Checking if there is not 0 records
if(!is_null($gGroup)) {

    // If there are more than 1 row. Run for each row
    foreach($gGroup as $g) {
        $groupItem[] = Group::find($g->id)->items;
    }
}

如上所示,如果我有10个组,Group::find.....->items查询将运行10个查询。我可以在1个查询中将它们合并为Group::all()的所有超过1个记录吗?

1 个答案:

答案 0 :(得分:1)

您想要的是Eager Loading,这会将您的查询操作减少为两个查询。

使用您的示例引用Laravel Eloquent文档:

  

你的循环将执行1个查询以检索上的所有组   表,然后为每个组检索项目的另一个查询。因此,如果   我们有25个组,这个循环将运行26个查询:1个用于原始   组和另外25个查询以检索每个组的项目。

     

幸运的是,我们可以使用预先加载来减少此操作   2个查询。查询时,您可以指定应该使用哪些关系   使用with方法急切加载:

$groups = App\Group::with('Item')->get();
$groupItem = array();

foreach ($groups as $group) {
    $groupItem[] = $group->items;
}