级联更新列关系Laravel 5.6

时间:2019-03-05 09:37:52

标签: php mysql laravel traits relation

我正在为自己的模特尝试新的特质

我的数据库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

3 个答案:

答案 0 :(得分:0)

您可以在模型上使用Events

答案 1 :(得分:0)

将列更新为其他表。您需要根据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

答案 2 :(得分:0)

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

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中的更改。