Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/247.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 改变';后代';与'的关系;兄弟姐妹';关系_Php_Laravel_Eloquent_Relational Database - Fatal编程技术网

Php 改变';后代';与'的关系;兄弟姐妹';关系

Php 改变';后代';与'的关系;兄弟姐妹';关系,php,laravel,eloquent,relational-database,Php,Laravel,Eloquent,Relational Database,我有如下变体表: +-------------------+------------------+------+-----+---------------------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------------------+------------------+------+-----+--

我有如下
变体
表:

+-------------------+------------------+------+-----+---------------------+----------------+
| Field             | Type             | Null | Key | Default             | Extra          |
+-------------------+------------------+------+-----+---------------------+----------------+
| id                | int(10) unsigned | NO   | PRI | NULL                | auto_increment |
| parent_product_id | int(10) unsigned | NO   | MUL | NULL                |                |
| child_product_id  | int(10) unsigned | NO   | MUL | NULL                |                |
+-------------------+------------------+------+-----+---------------------+----------------+
有限制:

CONSTRAINT `variant_products_child_product_id_foreign` FOREIGN KEY (`child_product_id`) REFERENCES `products` (`id`) ON DELETE CASCADE
CONSTRAINT `variant_products_parent_product_id_foreign` FOREIGN KEY (`parent_product_id`) REFERENCES `products` (`id`) ON DELETE CASCADE
假设它充满了:

| id | parent_product_id | child_product_id | 
|----+-------------------+------------------| 
| 28 | 9                 | 11               | 
| 29 | 17                | 30               | 
| 30 | 9                 | 59               | 
| 31 | 9                 | 60               | 
| 32 | 17                | 25               | 
起初,业务需求是一个(父)产品可以有多个子产品。在我的
产品中
型号

public function variants()
{
    return $this->hasMany(\App\Variant::class, 'parent_product_id', 'id');
}
变型
车型中:

public function child()
{
    return $this->belongsTo(\App\Product::class, 'child_product_id');
}
当我使用以下命令查询
产品
(id:9):

我得到了很好的回应:

{
  "id": 9,
  "name": "Foo",
  "description": "Ipsam minus provident cum accusantium id asperiores.",
  "variants": [
    {
      "id": 11,
      "name": "Bar"
    },
    {
      "id": 59,
      "name": "Fizz"
    },
    {
      "id": 60,
      "name": "Buzz"
    }
  ]
}
当询问产品
59
时,没有任何变体

现在,我需要重新定义我的关系,以便产品和变体将成为兄弟而不是后代

例如,在询问产品59后,期望的回答是:

{
  "id": 59,
  "name": "Fizz",
  "description": "Lorem ipsum dolor sit amet, consectetur adipisicing elit.",
  "variants": [
    {
      "id": 9,
      "name": "Foo"
    },
    {
      "id": 11,
      "name": "Bar"
    },
    {
      "id": 60,
      "name": "Buzz"
    }
  ]
}
如何在不改变数据库结构的情况下实现它。非常感谢任何帮助和提示

编辑:两个注释:


  • 每个孩子只能有一个父母。(屏幕上有一个唯一的键
    数据库中的子产品id
    列。)
  • “嵌套”只能有一个级别。这意味着,如果一个产品已经是子产品,它就不能是另一个产品的父产品

正如我在评论中所说,我认为最好还是保留某种类型的父母,以便更好地管理兄弟姐妹关系。例如,如果您希望59、9、11、60成为兄弟姐妹,您可以为他们所有人保留一个共同的父id,如999,这将使他们成为兄弟姐妹

另一件事是,如果每个项目只有一个
parent\u product\u id
,则不需要将其保存在单独的表中。您可以将
父产品\u id
保存在同一个表
产品
中,并在
\App\product
中设置变量,如下所示:

public function variants()
{
    return $this->hasMany(\App\Product::class, 'parent_product_id', 'parent_product_id');
}
现在,只需对查询部分稍作修改即可获得同级列表:

$query->with([
    'variants'  => function ($query) {
        $query->select(['products.id', 'products.name'])
    },
]);

如果产品59有自己的孩子呢?它们是否也会出现在最后的结果中。如果是这样,在查询产品9时,它们是否也必须出现?或者,如果9有自己的父代,它是否也必须显示为兄弟姐妹?我的印象是,兄弟姐妹(也包括父母)的定义模棱两可,如果持续应用,将导致大量“兄弟姐妹”。每个孩子只能有一个父母。(数据库中的
child\u product\u id
列上有一个唯一键。)只能有一个嵌套级别。这意味着,如果一种产品已经是一个孩子,它就不能是安托弗的父母。我明白了。所以没有孙子女:-)。产品11不应该也出现在你的结果中吗?是的,肯定应该:)我的错误。我已经编辑了我问题中的示例回答。@user1292810为什么要求产品59,在变体中也得到9?是59号,对吗?您是否需要使用关系,或者您可以使用任何方法来获得这样的JSON响应?
$query->with([
    'variants'  => function ($query) {
        $query->select(['products.id', 'products.name'])
    },
]);