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');
希望有用
我正在使用 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');
希望有用