【问题标题】:Cascade Update Columns Relational Laravel 5.6级联更新列关系 Laravel 5.6
【发布时间】:2019-03-05 09:37:51
【问题描述】:

我正在尝试为我的模型添加一个新的特征等

我的数据库 mysql 中有一些关系,我正在使用 laravel 5.6

我有一些表包含“is_approved”列

现在我想创建一些东西,当我为我的一个表设置 is_approved 为 false 时,与该表有关系的所有其他表都更新为我选择的值。

我该怎么做?

例如:

我有这些表:

-product_type [columns: 'id', 'type_name', 'is_approved']
-product_brand [columns: 'id', 'type_id', 'brand_name', 'is_approved']
-product_model [columns: 'id', 'brand_id', 'model_name', 'is_approved']
-product_name [columns: 'id', 'model_id', 'product_name', 'is_approved']

所有这些表都有“is_approved”列

我想要,当我将 product_type 记录“is_approved”列之一设置为 false 时,所有我的关系记录都更新为 false

【问题讨论】:

  • 你能解释一下它们之间的关系吗?
  • @ka_lin 我解释得很好,但是当然可以。 product_brand 里面有 type_id 指的是 product_type 和 product_brand 的关系,其他的都是这样的
  • 你定义了哪些模型?
  • @DelenaMalan ProductType, ProductBrand, ProductModel, ProductName :-??

标签: php mysql laravel traits relation


【解决方案1】:

您可以在模型上使用Events

【讨论】:

    【解决方案2】:

    将列更新到其他表。您需要根据 type_id 手动进行设置。像这样:

    $productbrand = ProductBrand::where('type_id', $type_id)->update(['is_approved' => 1]);
    $productmodel = ProductModel::where('brand_id', $productbrand->id)->update(['is_approved' => 1]);
    $productname = ProductName::where('model_id', $productmodel->id)->update(['is_approved' => 1]);
    

    或者您可以使用触发器来执行此操作。有关更多详细信息,请阅读此内容。

    http://www.expertphp.in/article/laravel-53-creating-mysql-triggers-from-migration-with-example

    【讨论】:

      【解决方案3】:

      您可以使用 ON UPDATE CASCADE 属性将is_approved 列作为所有外键的一部分:

      create table product_type(
          id int auto_increment primary key,
          type_name varchar(50),
          is_approved tinyint,
          index(id, is_approved)
      );
      
      create table product_brand (
          id int auto_increment primary key,
          type_id int,
          brand_name varchar(50),
          is_approved tinyint,
          index(id, is_approved),
          foreign key (type_id, is_approved)
              references product_type(id, is_approved)
              on update cascade
      );
      
      create table product_model (
          id int auto_increment primary key,
          brand_id int,
          model_name varchar(50),
          is_approved  tinyint,
          index(id, is_approved),
          foreign key (brand_id, is_approved)
              references product_brand(id, is_approved)
              on update cascade
      );
      
      create table product_name (
          id int auto_increment primary key,
          model_id int,
          product_name varchar(50),
          is_approved  tinyint,
          foreign key (model_id, is_approved)
              references product_model(id, is_approved)
              on update cascade
      );
      

      Online demo

      product_type 中的更改将自动更改product_brand 中的相应行。 product_brand 的更改将导致 product_model 的更改。 product_model 的更改将导致 product_name 的更改。

      【讨论】:

        猜你喜欢
        • 2018-09-18
        • 2018-02-17
        • 2018-12-21
        • 2023-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-28
        • 2020-11-21
        相关资源
        最近更新 更多