如何连接到在 cake php v3.x 的 salesforce 中创建为自定义字段的 Heroku connect table

How to connect to Heroku connect's table that is created as custom field in salesforce in cake php v3.x

我正在尝试通过 CakePHP 3 连接 Heroku connect table。出于某种原因,当我尝试连接名称以 '__c'

 PHP Fatal error:  Call to a member function newEntity() on boolean

之前,我解决了我在 CakePHP 中遇到的基本连接问题 形式。

所以我可以连接到 table 名称中没有“__c”的一个。从错误消息中,我了解到由于某种原因我的蛋糕应用无法连接到我想要连接的 table。

在我的 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' 连接这些字段 (table),请帮助我。

感谢 ndm Cake 在我使用这些特殊的 classes 时对其 class 名称和字母大小写很敏感。

我也是解决了一晚上的问题。 在我的控制器中,我向 table class 添加了单独的实体 classes。

use App\Model\Entity\SomeFields;
use Cake\ORM\TableRegistry;

并且当我创建数据对象时,我使用手动构造这些 classes 而不是使用 newEntity()

$someFieldTable = TableRegistry::get('BottomSheet');
$someField = new SomeFileds();

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

$someField->fieldName = data['fieldName'];

为了保存数据,我现在不得不手动调用保存函数

$someFieldTable->save($someField)

还有……瞧! 这是我的肮脏解决方案类型,我应该正确修复 classes 和文件的名称。 再次感谢 ndm 的帮助!

使用 TableRegistry class 是一个有效的答案,这里是在控制器中工作的自动装配 table 的正确方法:

如您所知,您的文件命名方案不正确,但这不是您使用 Heroku 的 table 名称格式的完整解决方案。您在 $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());
        }
    }
}