laravel 5:商品与特色商品的关系

laravel 5: relationship between products and featured products

我正在使用 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]);

现在,我正在尝试在我的视图中展示这些特色产品。如果我显示 Featured model 中的 product_id,一切正常:

@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 模型应该有一个使用 hasOne 关系的 featured() 方法,而 Featured模型应该有一个使用 belongsTo 关系的 product() 方法。所以在你的 App\Featured 模型中,你必须这样定义关系:

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

并且在您的 App\Product 模型中,您应该像这样定义关系:

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

希望有用