2015-05-29 52 views
1

我有2個表: - itemsgroups組合多個關係查詢在一個 - 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查詢中將它們合併爲Group::all()以上的1條記錄嗎?

回答

1

你想要的是Eager Loading,這會減少你的查詢操作到兩個查詢。

引述Laravel雄辯文檔,使用例如:

你的循環將執行1個查詢檢索所有集團對 表,然後爲每個組另一查詢檢索的項目。因此,如果 我們有25個組,則此循環將運行26個查詢:1個用於原始 組,另外25個查詢用於檢索每個組的項目。謝謝,我們可以使用熱切加載將此操作減少爲僅查詢 。查詢時,您可以指定哪些關係應該 使用與方法渴望加載:

$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','c',但它不返回,'組名''stackoverflow'和它是這些項目所屬的'id'。 只接收'a','b'作爲一個數組很難理解,這些列表屬於哪個'id'或'group name'。我希望,你有我的觀點? 在我上面的查詢中,我可以保存另一組數據。但在您的查詢中,我無法獲得「羣組」數據。 –