2014-04-03 16 views
5

Ich verstehe, wie Eloquent für grundlegende Abfragen und Beziehungen zu verwenden, aber ich bin verwirrt, wenn Informationen basierend auf Beziehungen in mehreren Tabellen auswählen.Laravel Eloquent und mehrere Joins

Zum Beispiel kann ich die Daten bekomme ich aus der Datenbank muß die den Query Builder wie folgt verwendet:

$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(); 

Grundsätzlich, ich bin immer Daten aus den Produkt- und Produktdetails Tabellen basierend auf welcher Kategorie des Produkt ist ein Teil von und welche Art von Produkt es ist; Diese werden durch innere Joins definiert, um die Tabellen product_type und product_category zu pivotieren.

Nun vorausgesetzt, ich habe die eloquenten Beziehungen richtig eingerichtet, wie würde ich dies in Eloquent tun?

Hier sind die relevanten Teile der Eloquent Modelle

Produkt

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'); 
} 
} 

Produktdetails

class Productdetail extends Eloquent 
{ 


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

Product

class ProductTypes extends Eloquent{ 


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

Kategorie

class Category extends Eloquent{ 

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

Vielen Dank im Voraus

Antwort

12

Ihre Beziehungen sind korrekt und damit verbundene Tabellennamen Unter der Annahme ist: Kategorien und Arten, dies die Arbeit machen werden:

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(); 

It 2 ​​Abfragen ausgeführt werden (zunächst geeignete Produkte erhalten, zweite für Produktdetails zu ihnen) und zurück Eloquent Collection

+0

danke, es macht jetzt Sinn. – Rob

+0

Nach ein paar Stunden endloser Suche hast du meinen Tag gerettet, danke. – Sherif

-2

//routes.php

Ansicht

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