2016-04-03 31 views
0

Ben laravel 5. ile örnek bir e-ticaret web sitesi yazıyorum arasındaki ilişki Ben 2 Tablolar var:laravel 5: ürün ve özellikli ürünler

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

ve

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

Modelleri

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

O halde,Ben 4 featured products almak,: Artık

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

, benim görünümünde olan bu özellikli ürünleri göstermek için çalışıyorum. i Featured model den product_id gösteriyorsa, herşey yolunda:

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

Ama özellikli tarafından yönlendirilen product adını almak istiyorum. Ben bu şekilde çalıştı:

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

featured_products Çünkü (controller olarak) bir koleksiyon gibi görünüyor, ama çalışmıyor! görünümden ilişkiyi erişmek istediğinizde sizin Featured modelde

cevap

0

, sen yöntemde product() bir ilişki var, size durumda, özellik olarak yöntem adı diyebiliriz, bunu bir gereken bir yöntem product() adında var product mülkiyet böyle diyoruz:

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

otomatik modeldeki yapılandırmış ilişkisine dayalı product name yazacak.

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

Düzenleme: Featured model olması gerekirken

, ben yanlış bir ilişki tanımlıyorsanız sizin Product modelini tahmin

Üzgünüm benim kötü, hasOne ilişkiyi kullanan bir featured() yöntem olmalıdır belongsTo ilişkisini kullanarak product() yöntemi. İlk,

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

o

+0

Hi işleri Umut:

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

Ve şöyle ilişkiyi tanımlamak gerekir sizin App\Product modelinde: Yani App\Featured modelinde, böyle ilişkiyi tanımlamak zorunda Yardım için teşekkürler. Bu yolu denedim, ancak şu döndürüyor: 'ErrorException Connection.php satırında 673: SQLSTATE [42S22]: Sütun bulunamadı: 1054 Bilinmeyen sütun 'products.product_id' in 'where cümlede' (SQL: select * from) 'Ürünler' nerede 'product'. 'product_id' null ve 'products'. 'product_id' null limit 1 değil. (Görüntüle:/home/vagrant/Code/projects/mwt-lamp/resources/views/widget/özellikli .blade.php) (Görünüm: /home/vagrant/Code/projects/mwt-lamp/resources/views/widgets/featured.blade.php) ' – luca89pe

+0

Üzgünüm benim hatam, Featured' modeli' ürünü olmalıdır 'ederken,' hasOne' ilişkisini kullanan bir 'özellikli()' yöntem olmalıdır, yanlış bir ilişki tanımlıyorsanız sizin 'Product' modelini tahmin ('' belongsTo' yöntemini kullanarak yöntem. Yani 'App \ Featured' modelinde, bu gibi bir ilişkiyi tanımlamanız gerekir: 'return $ this-> belongsTo ('App \ Product');'. '; Ve' App \ Product' modelinde Eğer ('App \ Seçme')> gibi ilişki böylece '$ this- dönmek hasOne tanımlamalıdır. o 'Featured' modeline işlev' ürün() 'üzerinde belongsTo'' üzere –

+0

Evet, çalışıyor, ben sadece değişmiş 'hasOne' çalışır Umut. Cevabı düzenleyebilir misiniz, ben de Cevap olarak ayarlayabilir miyim? , size – luca89pe