我有2个表: - items
和groups
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个记录吗?
答案 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;
}