0

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

标志将是预定义的,但以后可能会添加或删除标志。我可以用 和 将它们存储在一个表FlagIDFlagName

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

Objects如果我随后使用连接进行查询,则使用它们的“设置”标志很容易提取。

但是我的 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

这样,我不需要针对每个对象存储所有未设置的标志,因此我不需要担心在添加标志时使用未设置的标志预先填充表。

是否有会生成此结果集的查询?

4

2 回答 2

2

你需要这样的东西:

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
于 2011-05-28T13:12:34.673 回答
0

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

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

PHP 中位标志的最佳实践

于 2011-05-29T10:35:58.510 回答