我一直在阅读有关数据库选择等的 Nette 教程,但我仍然不明白,Nette 是如何知道的,什么是外键,什么不是。我需要定义它吗?如果是这样,怎么做?文档中对此一无所知。
根据这个文档,我不必定义外键。由于我习惯了 Java JPA,这对我来说听起来有点奇怪。
Nette 甚至生成数据库吗?(到目前为止,我不这么认为)。
Nette\Database 不会生成数据库,它会检查数据库并发现外键 - 请参阅 ActiveRow 文档,特别是M:1 关系的描述:
有一个关系是一个常见的用例。本书有一位作者。本书有一名翻译。获取相关行主要是通过
ref()
方法来完成的。Ref() 方法接受两个参数:目标表名和源连接列。参见示例:$book = $context->table('book')->get(1); $book->ref('author', 'author_id');
[…]
这一切都很好,但它有点麻烦,你不觉得吗?数据库已经包含外键定义,为什么不自动使用它们呢?让我们这样做吧!
如果我们调用不存在的属性,ActiveRow 会尝试将调用属性名称解析为“具有一个”关系。[强调我的] 获取此属性与仅使用一个参数调用 ref() 方法相同。我们将唯一的参数称为键。键将被解析为特定的外键关系。传递的键与行列匹配,如果匹配,则在匹配列上定义的外键用于从相关目标表中获取数据。
您可以在源代码中看到它在内部是如何工作的。