2015-05-29 4 views
1

У меня 2 таблицы: - items и groupsОбъединение нескольких запросов отношения в одном - Laravel

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

Что вы хотите, это Eager Loading, это уменьшит ваши запросы на два запроса.

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

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

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

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

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

Это не возвращать данные группы как «имя группы», он вернулся только все «список элементов». Я также хочу иметь групповые данные, такие как «имя группы» с их списком элементов. –

+0

Не могли бы вы уточнить? Это делает то же самое, что и ваш код. И переменная '$ group' имеет ваши данные группы –

+0

Да, вы правы, но в моем случае у меня есть другой сценарий, Я имею в виду. группа, которая имеет id - '1', имеет имя« stackoverflow »и имеет элементы' a', 'b',' c'. Поэтому он возвращает только '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''. Получение только 'a',' b', поскольку массив затрудняет понимание, к которому относятся 'id' или' group name'. Надеюсь, ты понял? в моем запросе выше, я могу сохранить другой массив данных группы. Но в вашем запросе я не могу получить данные «группы». –

Смежные вопросы