CakePHP 3.1不会保存简单的hasMany关系

dan*_*ele 5 php cakephp cakephp-3.0

我有两个实体,SiteSitesMetaData我想用的hasMany和属于关联协会联系.

我根据CakePHP 3.0书创建了一切,但出于某种原因,它没有生成或保存关联.

这是我的关系

SitesTable:

$this->hasMany('SitesMetaData', [
    'foreignKey' => 'site_id',
    'dependent' => true
]);
Run Code Online (Sandbox Code Playgroud)

和SitesMetaDataTable(通过烘焙模型自动生成):

$this->belongsTo('Sites', [
    'foreignKey' => 'site_id',
    'joinType' => 'INNER'
]);
Run Code Online (Sandbox Code Playgroud)

这是我的控制器功能:

    $site = $this->Sites->newEntity();
    if ($this->request->is('post')) {
        $site = $this->Sites->patchEntity($site, $this->request->data, ['associated' => ['SitesMetaData']]);
        if ($this->Sites->save($site)) {
            $this->Flash->success(__('The site has been saved.'));
            return $this->redirect(['_name' => 'admin:home']);
        } else {
            $this->Flash->error(__('The site could not be saved. Please, try again.'));
        }
    }
Run Code Online (Sandbox Code Playgroud)

这是在patchEntity之后的$ this-> request-> data和$ site的转储:

 /src/Controller/Admin/SitesController.php (line 33)

[
'title' => 'test',
'alias' => 'sdfs',
'layout' => 'default',
'sort' => '3',
'sites_meta_data' => [
    (int) 0 => [
        'key' => 'keyword',
        'value' => 'test'
    ]
]
]

/src/Controller/Admin/SitesController.php (line 34)

object(App\Model\Entity\Site) {

'title' => 'test',
'alias' => 'sdfs',
'layout' => 'default',
'sort' => (int) 3,
'[new]' => true,
'[accessible]' => [
    'title' => true,
    'alias' => true,
    'layout' => true,
    'sort' => true
],
'[dirty]' => [
    'title' => true,
    'alias' => true,
    'layout' => true,
    'sort' => true
],
'[original]' => [],
'[virtual]' => [],
'[errors]' => [],
'[repository]' => 'Sites'

}
Run Code Online (Sandbox Code Playgroud)

另外值得注意.我尝试使用TableRegistry::get('SitesMetaData')->newEntitywith 创建SitesMetaData $this->request->data['sites_meta_data'],它工作,所以我将其$site->sites_meta_data[]设置为脏并设置为脏并尝试保存,我收到此错误:

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'key, value, created, modified) VALUES (22, 'keyword', 'test', '2015-09-25 18:55:' at line 1
Run Code Online (Sandbox Code Playgroud)

在这种情况下,22将是创建后的网站ID.

更新:

虽然文档只提到在使用newEntity()和belongsToMany关联时需要这样做(据我所见),我添加sites_meta_data到Site实体的$_accessible属性,现在我甚至在使用时得到了上面的SQL错误$this->Sites->patchEntity($site, $this->request->data ...),现在它正确构建了SitesMetaData实体.

小智 0

就sql错误而言:

key不是有效的列名,因为它是 SQL 语言构造。

日期字段看起来很奇怪'2015-09-25 18:55:''test' 您确定填写正确吗?该错误可能源于它不是日期时间列的有效值。

我建议使用 chronos 实体填充它们/Cake/i18n/Time