cakephp - 使用独立 CakePHP ORM 时在哪里定义表/实体类?
问题描述
我正在使用 cakephp CakePHP-orm的独立子项目“cakephp-ORM” 。
我在文档中找不到在文件系统上定义表和实体的位置。
它解释了如何创建表,但没有将它们保存到哪里。然后会在自动加载时调用该表,还是您必须自己要求/包含它们?文档章节
提前致谢!
解决方案
你可能想在 GitHub 上创建一个问题,因为独立使用的文档肯定可以改进。
约定类似于 CakePHP 应用程序的约定
单独使用时,ORM 默认会在Model\Table
andModel\Entity
命名空间中查找表和实体类,并且表类应该使用Table
后缀。所以 using$locator->get('Articles')
会查找\Model\Table\ArticlesTable
,如果存在这样的表类,则会查找相应的实体类为\Model\Entity\Article
。
这些约定与在 CakePHP 应用程序中使用 ORM 时存在的约定几乎相同,只是在 CakePHP 应用程序中通常有一个通过App.namespace
配置选项配置的基本命名空间。您也可以将其与独立的 ORM 一起使用,即如果您这样做:
\Cake\Core\Configure::write('App.namespace', 'MyApp');
鉴于上面的示例,它将在查找类时被拾取并添加到前面,这将是\MyApp\Model\Table\ArticlesTable
and \MyApp\Model\Entity\Article
。当此类类不存在时,ORM 将使用所谓的泛型/自动表,即实例\Cake\ORM\Table
而\Cake\ORM\Entity
不是其具体子类。
自动加载由您决定
将文件放在文件系统中的哪个位置完全取决于您,您只需要确保它们可以通过这些名称自动加载。例如,如果您像这样使用 PSR-4 自动加载:
"autoload": {
"psr-4": {
"MyApp\\": "src/"
}
}
那么相应的文件将是src/Model/Table/ArticlesTable.php
and src/Model/Entity/Article.php
,并且您将配置基本命名空间,如上所示。
您可以使用完全限定名称,而不是依赖命名约定
也可以对表和实体使用 FQN,例如:
$table = $locator->get('Articles', [
'className' => \Custom\Fully\Qualified\Name\To\ArticlesTable::class
]);
实体和关联的自定义 FQN 可以在相应的表类中设置:
namespace Custom\Fully\Qualified\Name\To;
use Cake\ORM\Table;
class ArticlesTable extends Table
{
public function initialize(array $config)
{
$this->setEntityClass(\Custom\Fully\Qualified\Name\To\Article::class);
$this->hasMany('Comments', [
'className' => \Custom\Fully\Qualified\Name\To\CommentsTable::class
]);
}
}
$table
的实例也是如此\Custom\Fully\Qualified\Name\To\ArticlesTable
,查询记录将返回\Custom\Fully\Qualified\Name\To\Article
实例,包含Comments
将使用\Custom\Fully\Qualified\Name\To\CommentsTable
.
也可以看看
考虑到这一点,您应该能够参考 CakePHP ORM 文档以进一步使用。
推荐阅读
- r - 在 R 中执行 Postgres 函数
- python - DataFrame.where,使用数组作为条件时出错
- python - 我有一个包含 130 个变量的数据集,我必须检查所有变量的相关性,有什么方法可以检查一次
- ios - 观察 NSManagedObject 变量上的 didSet
- flutter - 将 Flutter 动画场景编码为视频文件
- html - 如何防止孩子在flexbox中超出其父宽度?
- excel - 输出字符串文本数组,但在代码字典数组中我有两个具有相同字母的字符串
- javascript - 错误类型错误:无法读取未定义的属性“替换”
- python - 在有向图中查找结束节点
- android - 当有一个带按钮的 RecyclerView 时,SetFocus 无法使用硬件键盘处理 Activity 的 EditText