2014-09-30 106 views
1

關係我有一個定義關係Category型號:遍歷與預先加載

public function entries() { 
    return $this->belongsToMany('Entry','entries_categories'); 
} 

當我使用:

$category = Category::find(8); 

echo $category->name."<br />"; 
$entries = $category->entries()->get(); 

foreach ($entries as $e) { 
    echo $e->domain."<br />"; 
} 

它工作正常 - 顯示它應該。

但是當我嘗試使用預先加載:

$category = Category::with('entries')->find(8); 

echo $category->name."<br />"; 
foreach ($category->entries as $e) { 
    echo $e->domain."<br />"; 
} 

我收到以下錯誤:

Invalid argument supplied for foreach()

如果我的代碼更改爲:

$category = Category::with('entries')->find(8); 

echo $category->name."<br />"; 
foreach ($category->entries() as $e) { 
    echo $e->domain."<br />"; 
} 

我得到沒有錯誤,但循環不會執行一次。

如何在Eager加載的循環中顯示數據?在所有情況下,幾乎與數據庫相同的查詢都會運行,並且如果手動在phpMyAdmin中運行查詢,則會有數據。

+0

您在'entries'調用中必須有一些衝突。你不能通過'entries()'來循環它的關係對象。然而,使用'belongsToMany',只要'$ category-> entries'實際上將關係稱爲動態屬性,就可以在foreach循環中使用它。這就是說,檢查什麼碰撞(accessor?property?)**順便說一句**如果你想玩Eloquent,最好在cli中使用'artisan tinker',而不是在瀏覽器中調用它。 – 2014-09-30 10:06:06

+0

@JarekTkaczyk你可以添加它作爲答案,我會接受。我在數據庫的表中有一個「entries」列,用於存儲屬於類別的條目數(迄今爲止從未使用過),這就是爲什麼它不起作用 – 2014-09-30 10:11:21

回答

1

您必須在模型中有碰撞,例如。屬性/數據庫字段/存取當您使用

$category->entries; 

所以也沒有打電話dynamic property它返回一個Collection被稱爲,這可能在foreach循環使用。

// this works, because it explicitly calls the relation 
foreach ($category->entries()-get() as $e) 

// this would work the same way if there wasn't name collision 
// because under the hood it would call 
// $category->entries()->getResults(), which does the same as get() on this relation 
foreach ($category->entries as $e)