php 与相关产品的良好关系

r1zhe5dt  于 2023-11-16  发布在  PHP
关注(0)|答案(1)|浏览(91)

例如,假设我销售空调和空气过滤器。它们都是product表中的产品。但我还有一个related_products表,其中每个空调都有过滤器,其中product_id是AC,filter_id是过滤器产品表中对应的product_id:
| 产品ID| filter_id|
| --|--|
| 1 | 10 |
| 1 | 11 |
| 2 | 10 |
| 2 | 15 |
Laravel Eloquent中如何定义这些关系?这看起来几乎像是引用单个产品表的透视表。related_products表没有关联的Model(我不这么认为),所以我会尝试在Product模型中定义这个关系吗?

yqkkidmi

yqkkidmi1#

由于product_idfilter_id都指向products中的记录,这将是一个自引用的多对多关系,related_products作为products.product_id == related_products.product_idproducts.product_id == related_products.filter_id之间的枢轴:
https://laravel.com/docs/10.x/eloquent-relationships#many-to-many.
这与文档之间的唯一区别是,您需要在Product类中定义两次关系:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;

class Product extends Model {
  public function relatedProducts(): BelongsToMany {
    return $this->belongsToMany(self::class, 'related_products', 'id', 'product_id');
  }

  public function relatedFilters(): BelongsToMany {
    return $this->belongsToMany(self::class, 'related_products', 'id', 'filter_id');
  }
}

字符串

  • 注意事项:您可能需要颠倒'id', 'product_id''id', 'filter_id'的顺序,因为我不记得哪个是pivot表上的本地键(products.id),哪个是外键(related_products.product_idrelated_products.filter_id),而且我没有可用的数据库来测试和确认这一点 *

此外,默认情况下,many-to-many在Laravel中不使用中间模型,即不需要定义class RelatedProduct extends Model { ... }。如果你愿意,你可以 *,Laravel支持这一点,但这不是必需的:
https://laravel.com/docs/10.x/eloquent-relationships#defining-custom-intermediate-table-models

相关问题