引用同一模型的相同前两次键

时间:2019-05-22 15:57:29

标签: laravel eloquent model

我需要为产品建立一个咨询平台。用户可以在产品部分下提出建议。所以产品有很多建议。另外建议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。

3 个答案:

答案 0 :(得分:0)

编辑2

回答后,我明白了你想要什么。

只需将您的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在您的产品模型上添加相同的关系。

编辑1

对不起,您在我回答后编辑了帖子...

您能否解释一下'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