2013-06-21 48 views
1

我們在一個數據庫上工作,在這個數據庫中表名是在本地命名的。如何將兩個表與我的Eloquent查詢結合起來?

table.product 
-- id 
-- picture 
-- category_id 

table.category 
-- id 
-- caterory_name 
-- category_directory 

表中有一些產品。 product.category_id應該指向category.id這樣系統就會知道該產品屬於所需的表格。

我們可以通過使用INNER JOIN來做到這一點,但我們不能用Laravel來做到這一點。我們可能需要使用has/belongs_to等配置我們的模型。

這是我們奮鬥的地方。

//Controller 
$products = Product::all(); 

return View::make('theme-admin.product_list') 
    ->with('products', $products); 

//View (in foreach) 
{{ URL::to('uploads/categories/[NEED_CATEGORY.CATEGORY_DIRECTORY_HERE]/' . $products[$k]->picture) }} 

,因爲我們只有通過Product::all()我們不能讓我們的意見Category.category_directory信息。

我們該如何做到這一點,$ products數組還包含每個值的category.category_directory,我們可以像訪問它一樣; $產品[$ K] - > CATEGORY_NAME?

謝謝!

+0

難道下面的工作我的建議?我提供的第一種方法是在循環中多次查詢數據庫,但是您還必須認識到,即使您建立了關係,它仍然運行多個查詢,您可以通過急切的加載來解決問題.....讓我知道如果這有幫助 – KyleK

回答

1

在您的產品型號創建類別的關係:

class Product extends Eloquent { 

    private $table = 'myProductsTableName'; 

    public function category() 
    { 
    return $this->belongsTo('Category', 'myCategoryColumnID'); 
    } 

} 

class Category extends Eloquent { 

    private $table = 'myCategoriesTableName'; 

} 

除非你需要選擇所有產品從一個特定的類別,你並不需要創建您的分類模型的hasMany關係。

如果您的產品表不符合singular_table_name_id規則(product_id),您只需使用myCategoryColumnID。

然後,只需使用它:

//View (in foreach) 
{{ URL::to('uploads/categories/'.$products[$k]->category->category_directory.'/' . $products[$k]->picture) }} 
+0

獲取異常「嘗試獲取非對象的屬性。」順便說一下,category()中的Category是模型還是數據庫表名的名稱?我的數據庫表名稱略有不同,因爲它們是本地化的,我翻譯它們只是爲了發佈在stackoverflow上。概念仍然相同。 – Aristona

+0

我組合了你的回覆以及回覆者的回覆,並找到了自己的解決方案。非常感謝! – Aristona

1

我想建立一個關係......

class Product extends Eloquent { 

public function category() 
{ 
    return $this->belongsTo('Category'); 
} 

} 

class Category extends Eloquent { 

public function product() 
{ 
    return $this->hasMany('Product'); 
} 

} 

您在realtionship使用的名稱是型號名稱.....所以一定如果您使用的表名不同於您的型號名稱,那麼您將其設置爲您的型號

protected $table = "yourtablename"; 

然後使用它所以...

{{ URL::to('uploads/categories/'.$products[$k]->category->category_directory.'/' 

您仍然會以這種方式多次查詢數據庫......這稱爲N + 1效應。例如,如果您有5個產品,則會執行一個查詢以獲取這些產品。然後在循環中我們正在執行一個查詢來獲取類別。這導致總共6個查詢。

爲了解決此問題,使用預先加載,從而降低在本例中的6個查詢到2

$products = Product::with('category')->get(); 

然後發送到您的視圖,在那裏你可以做你的foreach循環..

foreach($products as $val){ 
//To output the directory 
echo $val->category->category_directory; 

} 

或者刀片...

@foreach($products as $val) 
{{URL::to('uploads/categories/'.$val->category->category_directory.'/'.$val->picture)}} 
@endfor 
+1

視圖不應該對你的模型有太多瞭解,他們應該接收要顯示的數據,而不是查詢數據庫表並從數據庫中提取數據。 –

+0

對不起,這是我的壞....它的get()不是所有(),請參閱http://four.laravel.com/docs/eloquent#eager-loading – KyleK

+0

@KyleK非常感謝! – Aristona

相關問題