У меня есть 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 запрос для всех более 1 записей Group::all()
?
Что вы хотите Нетерпеливая загрузка, это сократит ваши операции запроса на два запроса.
Цитирую документы Laravel Eloquent, используя ваш пример:
Ваш цикл выполнит 1 запрос для извлечения всех групп на
таблица, затем еще один запрос для каждой группы, чтобы получить элементы. Так что если
у нас есть 25 групп, этот цикл будет выполнять 26 запросов: 1 для оригинала
группа и 25 дополнительных запросов для получения элементов каждой группы.К счастью, мы можем использовать готовую загрузку, чтобы уменьшить эту операцию до
2 запроса. При запросе вы можете указать, какие отношения должны
быть загруженным с помощью метода with:
$groups = App\Group::with('Item')->get();
$groupItem = array();
foreach ($groups as $group) {
$groupItem[] = $group->items;
}
Других решений пока нет …