我需要为产品建立一个咨询平台。用户可以在产品部分下提出建议。所以产品有很多建议。另外建议belongsTo产品。但是在 product_advices 表上,我有 product_id 和 product_advice_id 都引用了product表上的id。 所以这就是问题所在。我可以从product_advices表中获取建议,该表引用了product_id。但是我该如何将另一个作为产品。
product->advices to show advice and user message
each advices as advice and advice->product->name to show adviced product name
我无法与他们之间的雄辩建立联系。
//Product Model
public function advices()
{
return $this->hasMany('App\ProductAdvice', 'product_id');
}
//ProductAdvice Model
protected $table = 'product_advices';
public function product() {
return $this->belongsTo('App\Product', 'product_id');
}
//Product Advice Table
Schema::create('product_advices', function (Blueprint $table) {
$table->increments('id');
$table->integer('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->text('body')->nullable();
$table->integer('product_id')->unsigned();
$table->foreign('product_id')->references('id')->on('products')->onDelete('cascade');
$table->integer('product_advice_id')->unsigned();
$table->foreign('product_advice_id')->references('id')->on('products')->onDelete('cascade');
$table->timestamps();
});
例如: Iphone有很多用户建议。 Iphone->建议从product_advices中获取建议,其中iphone属于product_id列。 当用户向iPhone推荐Samsung Galaxy S10时。三星参考product_advices表上的product_advice_id列。但是如何展示三星Galaxy S10作为产品。 $ advice-> product-> name 返回Iphone而不是Samsung Galaxy S10。
答案 0 :(得分:0)
回答后,我明白了你想要什么。
只需将您的ProductAdvice模型更新为具有其他关系,例如:
class ProductAdvice extends Model
{
public function product()
{
return $this->belonsTo('App\Product', 'product_id');
}
public function related()
{
return $this->belonsTo('App\Product', 'product_advice_id');
}
}
那么您可以做:
$product = Apple
$product->advices->message = 'blablabla'
$product->advices->related = 'ProductX'
如果需要倒序,请$advice->product->related
在您的产品模型上添加相同的关系。
对不起,您在我回答后编辑了帖子...
您能否解释一下'product_advice_id'的必要性?您已经有了product_id。
除非您想要一个数据透视表,例如:Product-> ProductAdvice-> Advice,因为您可以将建议信息放入Advice表并将其链接到产品(belongsTo),所以您不需要这种建议,消除了使用ProductAdvice数据透视表的必要性。
我认为您的结构应如下所示:
产品模型以及所有产品数据
ProductAdvice 模型和 product_id 和建议信息(消息,等级等)
然后,您的产品有很多建议,而您的建议属于产品:
class Product extends Model
{
public function advices()
{
return $this->hasMany('App\ProductAdvice', 'product_id');
}
}
class ProductAdvice extends Model
{
public function product()
{
return $this->belonsTo('App\Product', 'product_id');
}
}
最后,您可以查询特定产品的建议以获取建议信息:
$product->advices->message
$product->advices->rating
或如果有建议,请查询产品名称:
$advice->product->name
答案 1 :(得分:0)
因此,如果您了解得很好,您希望获得产品A的建议,以返回产品B的名称。 您可以通过创建与同一模型相关的多种方法来做到这一点。
您的模型将与此类似:
amount = 12.42
然后,您将不得不在桌布名称中创建另一列:related_id(它可能是其他名称,只是使其与模型匹配。您还可以将Relations()和Relation()方法更改为所需的名称。 )
之后,这就是您存储数据的方式。您必须使代码将良好的产品模型关联到product_id和related_id中。这条路。您可以拥有class Product extends Model
{
public function advices()
{
return $this->hasMany('App\ProductAdvice', 'product_id');
}
public function relations()
{
return $this->hasMany('App\ProductAdvice', 'related_id');
}
}
class ProductAdvice extends Model
{
public function product()
{
return $this->belonsTo('App\Product', 'product_id');
}
public function relation()
{
return $this->belonsTo('App\Product', 'related_id');
}
}
答案 2 :(得分:0)
现在找到了这样的解决方案。
// ProductAdvice模型
protected $table = 'product_advices';
public function user()
{
return $this->belongsTo('App\User');
}
public function product() {
return $this->belongsTo('App\Product', 'product_id');
}
public function advicedProduct()
{
return Product::where('id', $this->product_advice_id)->first();
}
//产品型号
public function advices()
{
return $this->hasMany('App\ProductAdvice', 'product_id');
}
我如何在视图上显示它
@foreach($product->advices as $advice)
<li>{{ $advice->body }} - {{ $advice->advicedProduct()->name }}</li>
@endforeach