Я пишу пример сайта электронной коммерции с Laravel 5.
У меня есть 2 таблицы:
Schema::create('products', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->text('description');
$table->float('price');
$table->integer('category_id');
$table->timestamps();
});
а также
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');
});
модели
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');
}
}
Тогда у меня есть Controller
где я беру 4 featured products
:
$featured_products = Featured::limit(4)->get();
return view('home', ['featured_products' => $featured_products]);
Сейчас я пытаюсь показать эти популярные продукты на мой взгляд. Если я покажу product_id
от Featured model
, все отлично:
@foreach($featured_products as $prod)
{{$prod->product_id}}
@endforeach
Но я хочу взять имя product
по указанным признакам. Я попробовал так:
@foreach($featured_products as $prod)
@foreach($prod as $p)
{{$p->name}}
@endforeach
@endforeach
Так как featured_products
(в controller
Кажется, это коллекция, но она не работает!
В вашем Featured
модель, у вас есть отношения в методе product()
когда вы хотите получить доступ к отношению из представления, вы можете вызвать имя метода как свойство, в вашем случае у вас есть метод с именем product()
так что вы должны позвонить product
свойство как это:
@foreach($featured_products as $prod)
{{ $prod->product->name }}
@endforeach
Это автоматически напишет product name
на основе отношений, которые вы настроили в модели.
Ссылка: https://laravel.com/docs/5.2/eloquent-relationships
Редактировать:
Извините, мой плохой, я думаю, вы определяете неправильное отношение, ваш Product
модель, должна иметь featured()
метод, который использует hasOne
отношение, в то время как Featured
модель должна иметь product()
метод с использованием belongsTo
связь. Так в тебе App\Featured
модель, вы должны определить отношение следующим образом:
return $this->belongsTo('App\Product');
И в твоем App\Product
Модель вы должны определить отношение так:
return $this->hasOne('App\Featured');
Надеюсь, что это работает
Других решений пока нет …