【问题标题】:Laravel Schema: Require at least one of four columns is not nullLaravel Schema:要求至少四列之一不为空
【发布时间】:2021-02-23 19:54:35
【问题描述】:

我的结构如下所示:

Attribute Values Table
+----+-----------+---------------+-------------+-------------+
| id | option_id | integer_value | price_value | text_value  |
+----+-----------+---------------+-------------+-------------+
|  1 | 4         | NULL          | NULL        | NULL        |
|  2 | NULL      | 24            | NULL        | NULL        |
|  3 | NULL      | NULL          | NULL        | Lorem Ipsum |
|  4 | NULL      | NULL          | 30.50       | NULL        |
+----+-----------+---------------+-------------+-------------+

(为简洁起见,删除了一些列)

但基本上,条目的类型可以是对选择选项的引用 (option_id),也可以是整数值 (integer_value),也可以是十进制值 (price_value),也可以是文本值 (price_value)。 text_value)。省略的列之一是attribute_id,它对应于具有枚举的条目,该枚举存储这四列中的哪一列。

有没有办法在 Laravel 架构中添加一个约束,即这四列中至少有一个必须为非空?

【问题讨论】:

  • 使用required_without_all 规则将其作为验证约束处理。 stackoverflow.com/questions/23401365/…
  • 顺便说一句,这违反了 1NF,它要求所有行/列交叉点都有一个值(或者至少一个适用于它们的值,即使您目前不知道它)。在您的情况下,您故意制作了一个只有 40% 不为空的表格
  • @apokryfos 谢谢,但有什么替代方案?只需将所有内容存储为字符串并根据类型枚举进行转换?例如,如果我想搜索某个范围内的所有整数值怎么办?另外,我无法对 option_id 列进行外键约束。
  • 4 个表格是你如何规范化这个

标签: mysql laravel


【解决方案1】:

如果您始终只填写其中一列,我建议您将架构更改为仅两列

喜欢

+----------+--------------+------------+
|    id    |     value    |    type    |
+----------+--------------+------------+

value 将始终有一个值,type 将包含您提到的 4 种类型

即:option_idinteger_valueprice_valuetext_value

这样干净。

在 laravel 中你不能添加指定的约束。您必须在插入之前验证您的输入。

但是,如果您真的想添加数据库级别的约束,您可以尝试在每次插入之前添加触发器,以使用表上的 DB::unprepared 函数验证您的需求。

触发器可能看起来像这样(我没有尝试过)

DB::unprepared("
    DELIMITER $$
    CREATE TRIGGER `foo`
    BEFORE INSERT ON `table`
    FOR EACH ROW
    BEGIN
        IF (
            new.option_id IS NULL
            AND new.integer_value IS NULL
            AND new.price_value IS NULL
            AND new.text_value IS NULL
        ) 
        THEN SIGNAL SQLSTATE '02000' 
            SET MESSAGE_TEXT = 'your message here';
        END IF;
    END$$
    DELIMITER ;
");

【讨论】:

    猜你喜欢
    • 2011-02-18
    • 2017-07-05
    • 2016-11-03
    • 1970-01-01
    • 2015-03-20
    • 2016-06-29
    • 2023-03-20
    • 1970-01-01
    • 2014-11-23
    相关资源
    最近更新 更多