将标志存储在 SQL 数据库中并在 Symfony 中使用它们

发布于 2024-11-10 09:21:36 字数 777 浏览 2 评论 0原文

我在数据库中有一组对象,它们可以有许多与之关联的布尔标志。

这些标志将被预先定义,但以后可能会添加或删除标志。我可以将它们存储在带有 FlagIDFlagName 的表中。

存储这些标志的值很容易 - 它们可以保存在一个包含 ObjectIDFlagID 的简单表中 - 该表中的条目将指示“设置”标志。

如果我随后使用联接进行查询,则可以轻松提取带有“set”标志的对象

但是我的 Symfony 应用程序(使用 Doctrine 作为 ORM)需要获取此连接中的所有“未设置”值,以便它可以提供用于设置它们的复选框 - 即理想的输出将是

ObjectID FlagID Value
1        1      True
1        2      False
2        1      False
2        2      False
3        1      False
3        2      True

这个结果集将由以下数据产生 这样,我不需要针对每个对象存储所有未设置的标志

ObjectID FlagID
1        1
3        2


FlagID   FlagName
1        Foo
2        Bar

,因此我不需要担心在添加标志时用未设置的标志预先填充表。

是否有一个查询会生成这个结果集?

I have a set of objects in a DB which can have a number of boolean flags associated with them.

The flags will be pre-defined but may flags may be added or removed later. I could store them in a table with FlagID and FlagName.

Storing the values of these flags is easy - they could be saved in a simple table containing the ObjectID and the FlagID - an entry in this table would indicate a 'set' flag.

If I then did a query with a join, it would be easy to extract the Objects with their 'set' flags.

But my Symfony application (using Doctrine as the ORM) needs to get all of the 'unset' values in this join so it can offer checkboxes for setting them - i.e the ideal output would be

ObjectID FlagID Value
1        1      True
1        2      False
2        1      False
2        2      False
3        1      False
3        2      True

This result set would result from the following data in the database

ObjectID FlagID
1        1
3        2


FlagID   FlagName
1        Foo
2        Bar

This way, I don't need to store all the unset flags against each Object, and thus I don't need to worry about pre-populating the table with unset flags whenever a flag is added.

Is there a query that will generate this resultset?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

梦中楼上月下 2024-11-17 09:21:36

你需要这样的东西:

select object.id,
       flags.id,
       object_flags.flag_id is null as has_flag
from objects
cross join flags
left join object_flags
on object_flags.object_id = objects.id
and object_flags.flag_id = flags.id

You need something like so:

select object.id,
       flags.id,
       object_flags.flag_id is null as has_flag
from objects
cross join flags
left join object_flags
on object_flags.object_id = objects.id
and object_flags.flag_id = flags.id
Bonjour°[大白 2024-11-17 09:21:36

另一种解决方案是使用 8 字节整数,它最多可以提供 64 个标志,您可以一次获取这些标志。它将消除获取多个记录并读取每个字段的麻烦。

参考
提取位标志的最有效方法

PHP 中位标志的最佳实践

another solution would be to use a 8byte integer which would give you upto 64 flags, that you could fetch at once. it will eliminate the hassle of fetching multiple records and read every field.

Refer
Most efficient way to extract bit flags

Best practices for bit flags in PHP

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文