Laravel 5: отношения между продуктами и избранными продуктами

Я пишу пример сайта электронной коммерции с 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_productscontrollerКажется, это коллекция, но она не работает!

1 ответ

Решение

В вашем 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');

Надеюсь, что это работает

Другие вопросы по тегам