2016-04-03 9 views
0

Ich bin ein Beispiel E-Commerce-Website mit Laravel Schreiben 5. Ich habe 2 Tische:Laravel 5: Beziehung zwischen Produkten und funktionsfähige Produkte

Schema::create('products', function (Blueprint $table) { 
    $table->increments('id'); 
    $table->string('name'); 
    $table->text('description'); 
    $table->float('price'); 
    $table->integer('category_id'); 
    $table->timestamps(); 
}); 

und

Schema::create('featureds', function (Blueprint $table) { 
    $table->integer('product_id')->unique()->unsigned(); 
}); 

Schema::table('featureds', function($table) { 
    $table->foreign('product_id')->references('id')->on('products')->onDelete('cascade'); 
}); 

Modelle

class Product extends Model 
{ 
    public function category(){ 
     return $this->belongsTo('App\Category'); 
    }  
} 

class Featured extends Model 
{ 
    public function product(){ 
     return $this->hasOne('App\Product', 'product_id'); 
    } 
} 

Dann habe ich eine Controller, wo ich 4 featured products nehmen:

$featured_products = Featured::limit(4)->get(); 
return view('home', ['featured_products' => $featured_products]); 

Nun, ich versuche, diese vorgestellten Produkte in meiner Ansicht zu zeigen. Wenn ich die product_id vom Featured model zeigen, alles ist in Ordnung:

@foreach($featured_products as $prod) 
    {{$prod->product_id}} 
@endforeach 

Aber ich will den Namen des product durch die vorge bezeichnet nehmen. Ich habe versucht, auf diese Weise:

@foreach($featured_products as $prod) 
    @foreach($prod as $p) 
    {{$p->name}} 
    @endforeach 
@endforeach 

Da featured_products (im controller) scheint eine Sammlung zu sein, aber es funktioniert nicht!

Antwort

0

In Ihrem Featured Modell, Sie haben eine Beziehung in Methode product(), wenn Sie die Beziehung aus der Sicht zugreifen möchten, können Sie den Methodennamen als Eigenschaft nennen könnte, in Ihnen Fall haben Sie eine Methode product(), so dass Sie genannt haben product Eigenschaft wie folgt aufrufen:

@foreach($featured_products as $prod) 
    {{ $prod->product->name }} 
@endforeach 

Es wird automatisch die product name schreiben basierend auf der Beziehung, die Sie im Modell konfiguriert haben.

Referenz: https://laravel.com/docs/5.2/eloquent-relationships

Edit:

Leider mein schlecht, ich denke, Sie eine falsche Beziehung definieren, Ihr Product Modell sollte eine featured() Methode haben, die hasOne Beziehung verwendet, während Featured Modell eine haben sollte product() Methode mit belongsTo Beziehung. So in Sie App\Featured Modell, müssen Sie die Beziehung wie folgt definieren:

return $this->belongsTo('App\Product'); 

Und in Ihrem App\Product Modell sollten Sie Beziehung wie so definieren:

return $this->hasOne('App\Featured'); 

Hoffe, es funktioniert

+0

Hallo, zuerst danke für die Hilfe. Ich habe diesen Weg versucht, aber es gibt folgendes zurück: 'ErrorException in Connection.php Zeile 673: SQLSTATE [42S22]: Spalte nicht gefunden: 1054 Unbekannte Spalte 'products.product_id' in 'Where-Klausel' (SQL: wählen Sie * aus 'products' wo 'products'. 'product_id' ist null und 'products'. 'product_id' ist kein Null-Limit 1) (View:/home/vagrant/Code/projects/mwt-lamp/resources/views/widgets/featured .blade.php) (View: /home/vagrant/Code/projects/mwt-lamp/resources/views/widgets/featured.blade.php) ' – luca89pe

+0

Sorry meine schlechte, ich denke, Sie definieren eine falsche Beziehung, Ihr 'Produkt' Modell, sollte eine' featured() 'Methode, die' hasOne' Beziehung verwenden, während 'Featured' Modell sollte ein' Produkt () 'Methode mit der' goesTo' Relation. Also müssen Sie in Ihrem "App \ Featured" -Modell die Beziehung wie folgt definieren: return $ this-> objectsTo ('App \ Product'); '. Und in Ihrem 'App \ Product' Modell sollten Sie eine Relation definieren wie' return $ this-> hasOne ('App \ Featured'); '. Hoffe, es funktioniert –

+0

Ja, es funktioniert, ich habe nur 'hasOne' zu' gehörtTo' auf Funktion 'Produkt()' in 'Featured' Modell geändert. Können Sie die Antwort bearbeiten, sodass ich sie als Antwort festlegen kann? Vielen Dank – luca89pe