Объединение запроса с несколькими отношениями в одном — laravel

У меня есть 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() ?

1

Решение

Что вы хотите Нетерпеливая загрузка, это сократит ваши операции запроса на два запроса.

Цитирую документы Laravel Eloquent, используя ваш пример:

Ваш цикл выполнит 1 запрос для извлечения всех групп на
таблица, затем еще один запрос для каждой группы, чтобы получить элементы. Так что если
у нас есть 25 групп, этот цикл будет выполнять 26 запросов: 1 для оригинала
группа и 25 дополнительных запросов для получения элементов каждой группы.

К счастью, мы можем использовать готовую загрузку, чтобы уменьшить эту операцию до
2 запроса. При запросе вы можете указать, какие отношения должны
быть загруженным с помощью метода with:

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

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]