相同的前两次关键时间指一个模型

我需要为产品建立一个建议平台。 用户可以在产品部分提出建议。 所以产品有很多建议。 建议产品归属。 但是在产品咨询台上 , 我有产品 id 和产品建议 , 这两个都是指产品表上的 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 当用户推荐三星 Galaxy S10 至 Iphone 时。 三星是指产品咨询列表中的产品 _ 意见 _ id 一栏。 但如何显示三星 Galaxy S10 的产品。 推荐 ->产品->名称返回Iphone而不是三星GalaxyS10。


EN From: Same Foreing Key Twice That Refers to One Model

10 Comments

  1. 正确设置了产品与产品建议的关系。 另一个是什么意思 ? 你试图在产品 _ 建议中获得产品名称 ?
  2. @ElieMorin 是的 , 我想用用户的注释来使用被建议的产品的名称。 更新员额以添加表列。
  3. 编辑 2

    听了你的回答 , 我知道你想要什么。

    更新您的产品建议模型 , 以建立另一种关系 , 例如 :

    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

    抱歉 , 你在我回答后编辑了这篇文章...

    你能解释一下产品的必要性吗? 你已经有了产品 _ id 。

    除非您想要一个枢纽表 , 例如 : 产品 ->生产建议->建议,在您的情况下不需要,因为您可以将建议信息放在咨询表中并将其与产品(属民)链接起来,从而取消生产建议轴心的必要性。

    我觉得你的结构应该是这样的 :

    所有产品数据的产品模型

    带有产品 _ 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. 员额更新。 产品提示 id 是指另一种产品推荐给产品 _ id 。 每个产品都有自己的页面 , 用户可以向其他产品推荐产品。 或许可以称之为标记。
    1. $product = Apple $product-->advices->message = user's message $product->advices->product = Product that recommended to Apple 这是我想做的。
    1. 谢谢你的解释 , 我想我现在明白了。 看看我的最新答复。
    1. 是的 , 它起了作用 , 但我不能理解产品建议 id 在那里是如何工作的 , 即使产品建议 id 不存在于产品表上。 我不记得了。 谢谢你。
  4. 看看答案 , 会有帮助的。 我觉得真正的问题是你怎么称呼那个函数。 您能给我们看一些代码 , 在那里您尝试使用建议 ->产品->名称。
  5. 所以 , 如果你理解得很好 , 你需要产品 A 的建议并退回产品名称 可以通过创建与同一模型相关的多个方法来实现这一点。

    你们的模特也会这样看 :

    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');
        }
    }
    

    然后你将不得不在你的 talbe 名称中创建另一个列 : religate _ id ( 它可能是其他的东西 , 只是使它在你的模型中匹配。 您还可以将关系 () 和关系 () 方法更改为您想要的任何名称。

    接下来就是你如何存储数据。 您必须使您的代码将好的产品模型关联到您的产品 _ id 和相关 _ id 中。 这边走。 您可以使用 $advice->product->name === 'iPhone' && $advice->relation->name === 'Samsung S10'

  6. 找到了这样的解决办法。

    / / 制作建议模式

    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
    

More articles:

  • 使用 Laravel Eliquent 查询具有相同属性的最少量相关模型
  • 使用多个表组合成一个的 Laravel Evient 模型 ( 无单独模型 )
  • 如何分割一个用户模型查询
  • Laravel 5.6 : 如何使用一个文件夹中的所有模型
  • Laravel 5.3 - 保存后无法检索模型 ID
  • Laravel 包括更新后与模型的关系
  • 为什么不删除拉拉威尔模型 ?
  • 建立拉拉威尔关系模型
  • 连接 Laravel 的数据库字段和模型属性
  • 在 WHMCS 版本 6 中添加自定义 E枇杷模型
  • 拉勒维尔 - 多重关系
  • Larav案中的用户跟踪 / 订阅关系模型
  • 我有两个模型消息和 messageto , 我正在使用 message 中的 message model 属性来形成一个页面 , 如何验证这些属性
  • 模型关系和路径得到模型 id
  • Laravel 4, 如何防止 Eliquent 模型处理某些属性?
  • 查询只返回一个用户
  • 是否有可能从 Laravel4 中的一个控制器的单一函数访问两个模型 ?
  • 如何添加自定义自动增量主键 Laravel 的模型
  • 在 Laravel 中调用连接或分离时 , 如何使"枢轴表"模型触发保存/保存的模型事件?
  • 模型中基于年龄的过滤拉拉瓦尔收集
  • Laravel 从另一个表获取数据
  • 将 1 个数组的合并值并入密钥相同的另一个数组
  • 拉勒维尔访问归属者模型有很多关系
  • 为多个表设计一个 Zend 模型?
  • 合并有相同列和表的 2 个查询
  • Python / 机器学习 : 我能把几个预测模型合并成一个吗
  • 在拉勒维尔创造一个链状的方法
  • 通过它获取另一个表的字符串
  • 如何在 Laravel 5.2 中得到一个控制器功能模型?
  • 如何在 Laravel 4 中获得与同名模型相关的模型字段?