2014-04-03 81 views
5

我理解如何使用Eloquent進行基本查詢和關係,但是當根據多個表中的關係選擇信息時,我開始感到困惑。Laravel雄辯和多重聯接

例如,我使用查詢生成器如下可以得到我從數據庫中需要的數據:

$data['products'] = DB::table('product') 
    ->select('product.id', 'product.ref_num', 'productdetails.name') 
    ->join('productdetails', function($join) 
    { 
     $join->on('product.id', '=', 'productdetails.product_id') 
      ->where('productdetails.website_id', '=', '7'); 
    }) 
    ->leftJoin('product_category', function($join) use($submenu_id){ 
     $join->on('product.id', '=', 'product_category.product_id') 
      ->where('product_category.category_id', '=', $submenu_id); 
    }) 
    ->leftJoin('product_type', function($join) use($type_id){ 
     $join->on('product.id', '=', 'product_type.product_id') 
      ->where('product_type.type_id', '=', $type_id); 
    }) 
    ->get(); 

基本上,我是從產品和產品詳細表基礎上的類別中獲取數據的產品是它的一部分,是什麼類型的產品;這些由內部聯接定義爲透視表product_type和product_category。

現在假設我有正確的雄辯關係設置,我將如何去做這個在雄辯?

這裏是雄辯模型的相關部分

產品

class Product extends Eloquent{ 

public function productdetails() 
{ 
    return $this->hasMany('Productdetail'); 

public function categories() 
{ 
    return $this->belongsToMany('Category', 'product_category', 'product_id', 'category_id'); 
} 

public function types() 
{ 
    return $this->belongsToMany('Producttype', 'product_type', 'product_id', 'type_id'); 
} 
} 

產品詳細信息

class Productdetail extends Eloquent 
{ 


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

ProductType

class ProductTypes extends Eloquent{ 


function products() 
{ 
    return $this->belongsToMany('products', 'product_id', 'type_id', 'product_id'); 
} 

類別

class Category extends Eloquent{ 

public function products() 
{ 
    return $this->belongsToMany('product', 'product_category', 'category_id', 'product_id'); 
} 
} 

在此先感謝

回答

12

假設你的關係是正確的和相關的表名是:類別和類型,這將做的工作:

Product::with('productdetails') 
    ->whereHas('categories', function ($query) use ($submenu_id) { 
      $query->where('categories.id', '=', $submenu_id); 
    }) 
    ->whereHas('types', function ($query) use ($type_id) { 
      $query->where('types.id', $type_id); // side note: operator '=' is default, so can be ommited 
    }) 
    ->get(); 

它將運行2個查詢(第一個爲獲得適當的產品,其次是與產品相關的細節)並返回Eloquent Collection

+0

謝謝你,現在是有道理的。 – Rob

+0

經過幾個小時的無盡搜索,你節省了我的一天,謝謝。 – Sherif

-2

//routes.php

/* relationship is : content has images(one to many). And I am extracting the images based on the name that is given in the search input ($keyword = Input::get('keyword') */ 


    $dbresults = DB::table('contents')->join('images', 'images.content_id', '=', 'contents.id')->where('contents.Name', 'LIKE', '%' .$keyword. '%')->get(); 

    return View::make('/results')->with("results", $dbresults); 

查看

@foreach($results as $result) 
{{ $result->image_1 }} 
@endforeach