如何连接到Heroku connect';s表,该表在cake php v3.x中作为salesforce中的自定义字段创建

如何连接到Heroku connect';s表,该表在cake php v3.x中作为salesforce中的自定义字段创建,php,postgresql,cakephp,heroku,salesforce,Php,Postgresql,Cakephp,Heroku,Salesforce,我正试图通过CakePHP3连接Heroku连接表。由于某些原因,当我尝试连接一个名称以“\uu c”结尾的表时,我会出现以下错误 PHP Fatal error: Call to a member function newEntity() on boolean 之前,我解决了我在CakePHP中遇到的基本连接问题 形式 所以我可以连接一个表名中没有“\uuu c”的表。从错误消息中,我了解到由于某种原因,我的蛋糕应用程序无法连接到我要连接的表 在我的App/Model/Table/som

我正试图通过CakePHP3连接Heroku连接表。由于某些原因,当我尝试连接一个名称以“\uu c”结尾的表时,我会出现以下错误

 PHP Fatal error:  Call to a member function newEntity() on boolean
之前,我解决了我在CakePHP中遇到的基本连接问题 形式

所以我可以连接一个表名中没有“\uuu c”的表。从错误消息中,我了解到由于某种原因,我的蛋糕应用程序无法连接到我要连接的表

在我的App/Model/Table/someFieldTable.php中,我有

 public function initialize(array $config)
{
    parent::initialize($config);
    $this->table('salesforce.some_field__c');
    $this->displayField('name');
    $this->primaryKey('id');
}
我的tableController.php中还包含以下内容

$somefield = $this->someField->newEntity();
   // variables are assigned to $somefield 
if($this->someField->save($someField)){
   // error handling here 
}

我还不熟悉CakePHP和Heroku connect。如果有人知道如何用CakePHP中的后缀“_c”连接这些字段(表),请帮助我

感谢ndm,当我使用这些特殊类时,Cake对其类名和字母大小写非常敏感

我昨晚也解决了这个问题。 在我的控制器中,我向表类添加了单独的实体类

use App\Model\Entity\SomeFields;
use Cake\ORM\TableRegistry;
当我创建数据对象时,我使用手动构造这些类,而不是使用newEntity()

现在我可以手动将变量分配给数据对象 比如说

$someField->fieldName = data['fieldName'];
为了保存数据,我现在必须手动调用save函数

$someFieldTable->save($someField)
而且。。。瞧! 这是我的肮脏类型的解决方案,我应该修复类和文件的名称正确的。
再次感谢您对ndm的帮助

感谢ndm,当我使用这些特殊类时,Cake对其类名和字母大小写非常敏感

我昨晚也解决了这个问题。 在我的控制器中,我向表类添加了单独的实体类

use App\Model\Entity\SomeFields;
use Cake\ORM\TableRegistry;
当我创建数据对象时,我使用手动构造这些类,而不是使用newEntity()

现在我可以手动将变量分配给数据对象 比如说

$someField->fieldName = data['fieldName'];
为了保存数据,我现在必须手动调用save函数

$someFieldTable->save($someField)
而且。。。瞧! 这是我的肮脏类型的解决方案,我应该修复类和文件的名称正确的。
再次感谢您对ndm的帮助

使用TableRegistry类是一个有效的答案,以下是使控制器中的自动连线表正常工作的正确方法:

正如您已经被告知的,您的文件命名方案不正确,但这并不是使用Heroku格式化表名的完整解决方案。$this->table()中的条目不应该是带有点的数据库的名称空间,因为该数据库是通过当前连接(很可能是在app.php中定义的默认数据源)附加的,您正在对其进行查询。整个修复将包括:

// 1. Change the file name to the correct scheme: SomeFieldTable.php

// 2. In order for the controller to autowire the table, you must correctly
// name the controller file as well: SomeFieldController.php

// 3. Change the table name within SomeFieldTable.php to the appropriate
// name: 'some_field_c'

public function initialize(array $config)
{
    parent::initialize($config);
    $this->table('some_field__c');
    $this->displayField('name');
    $this->primaryKey('id');
}

// 4. Finally, in the controller, the table is accessed via the camel capsed name

class SomeFieldController extends AppController
{
    public function getEndpoint()
    {
        $result_set = $this->SomeField->find()->all();
        $this->set('result_set', $result_set);
    }

    public function saveEndpoint()
    {
        $new_some_field = $this->SomeField->newEntity($this->request->data);
        if ($this->SomeField->save($new_some_field)) {
            $this->set('new_some_field', $new_some_field);
        } else {
            $this->set('errors', $new_some_field->errors());
        }
    }
}

使用TableRegistry类是一个有效的答案,以下是使控制器中的自动连线表工作的正确方法:

正如您已经被告知的,您的文件命名方案不正确,但这并不是使用Heroku格式化表名的完整解决方案。$this->table()中的条目不应该是带有点的数据库的名称空间,因为该数据库是通过当前连接(很可能是在app.php中定义的默认数据源)附加的,您正在对其进行查询。整个修复将包括:

// 1. Change the file name to the correct scheme: SomeFieldTable.php

// 2. In order for the controller to autowire the table, you must correctly
// name the controller file as well: SomeFieldController.php

// 3. Change the table name within SomeFieldTable.php to the appropriate
// name: 'some_field_c'

public function initialize(array $config)
{
    parent::initialize($config);
    $this->table('some_field__c');
    $this->displayField('name');
    $this->primaryKey('id');
}

// 4. Finally, in the controller, the table is accessed via the camel capsed name

class SomeFieldController extends AppController
{
    public function getEndpoint()
    {
        $result_set = $this->SomeField->find()->all();
        $this->set('result_set', $result_set);
    }

    public function saveEndpoint()
    {
        $new_some_field = $this->SomeField->newEntity($this->request->data);
        if ($this->SomeField->save($new_some_field)) {
            $this->set('new_some_field', $new_some_field);
        } else {
            $this->set('errors', $new_some_field->errors());
        }
    }
}

您应该从遵循/命名约定开始,
someFieldTable
是不可能的。也谢谢你的提示ndm!我在Table文件夹中编写了someFieldTable作为userTable.php等的示例。我的实际代码中有更多的实名变量。我只是想大致了解一下解决方案。因为构造函数有一个错误,所以我假设初始化函数有一个错误。特别是,在salseforce中,将“_c”作为表名后缀(即“自定义字段”)的所有表都存在问题。我认为salseforce如何设置表在cakephp中有一个技巧。如果你有更多的想法或意见,请在这里发表。这并不是真正的名称是否真实,
userTable
同样是错误的,而是关于小写字母和单数大小写,按照惯例,文件/类名应该是驼峰形的,即以大写字母开头,表类名必须是复数。另外,为了使模型在控制器中自动可用,它们的名称必须匹配,否则您需要手动加载它,这里没有显示。问题不在于数据库表,至少不在于所提到的错误。所以当我制作一个cake时,它需要一个大写字母和表名类,并且必须是复数。在昨晚的评论之后,我也尝试了一些解决方案,我将在下面写下我的解决方案。但一旦有机会,我一定会尝试你的解决方案!谢谢你的帮助!您应该从遵循/命名约定开始,
someFieldTable
是不可能的。也谢谢你的提示ndm!我在Table文件夹中编写了someFieldTable作为userTable.php等的示例。我的实际代码中有更多的实名变量。我只是想大致了解一下解决方案。因为构造函数有一个错误,所以我假设初始化函数有一个错误。特别是,在salseforce中,将“_c”作为表名后缀(即“自定义字段”)的所有表都存在问题。我认为salseforce如何设置表在cakephp中有一个技巧。如果你有更多的想法或意见,请在这里发表。这并不是真正的名称是否真实,
userTable
同样是错误的,而是关于小写字母和单数大小写,按照惯例,文件/类名应该是驼峰形的,即以大写字母开头,表类名必须是复数。另外,为了使模型在控制器中自动可用,它们的名称必须匹配,否则您需要手动加载它,这里没有显示。问题不在于数据库表,至少不在于所提到的错误。所以cake需要大写字母和表名