CakePHP 2x 到 3x,带 keepExisting 的 HABTM
CakePHP 2x to 3x, HABTM with keepExisting
我有两个模型与 Cake 中的 Has And Belongs To Many 关联关联 2.x。我正在尝试将我的应用程序移植到 Cake 3.3。通常,我在复制 Cake 2.x 关联中的 "keepExisting" 功能时遇到问题。现在,我正在尝试使用 "through" 功能,但我不确定我是否在寻找正确的树。
我有以下表格:
class ContestsTable extends Table
{
/**
* Initialize method
*
* @param array $config The configuration for the Table.
* @return void
*/
public function initialize(array $config)
{
parent::initialize($config);
$this->table('contests');
$this->displayField('name');
$this->primaryKey('id');
$this->addBehavior('Timestamp');
$this->belongsToMany('Events', [
'through' => 'ContestsEvents'
]);
}
}
class EventsTable extends Table
{
/**
* Initialize method
*
* @param array $config The configuration for the Table.
* @return void
*/
public function initialize(array $config)
{
parent::initialize($config);
$this->table('events');
$this->displayField('name');
$this->primaryKey('id');
$this->addBehavior('Timestamp');
$this->belongsToMany('Events', [
'saveStrategy' => 'append',
'through' => 'ContestsEvents'
]);
}
}
class ContestsEventsTable extends Table
{
public function initialize(array $config) {
$this->belongsTo('Contests');
$this->belongsTo('Events');
}
}
当我保存带有关联事件的初始比赛时,保存没有问题,关联记录是在加入 table 中创建的。当我编辑比赛记录并更改事件列表时,任何选定的事件都会被添加……但不再被选中的旧事件不会被删除。第二个问题是为已经存在的关系创建新的连接记录。我想保留现有记录而不是创建新记录。稍后在该应用程序中,我将在附加关系中使用连接记录 ID...并且我不希望每次更新覆盖的比赛记录时都重新生成该 ID。
我希望我在描述我正在尝试做的事情时是有意义的。但以最简单的形式,我试图复制通过 Cake 2x 中包含的 'unique' => 'keepExisting' 选项找到的功能,只是无法破解有关如何在 Cake 3.3 中实现此功能的代码?
在此先感谢您的帮助。
好的,就这样吧。首先,我认为我出于沮丧而写了上面的问题,如果不清楚,我深表歉意。我继续处理我应用程序的其他部分,这个问题一直困扰着我。好吧,我想通了...所以这是我的答案:
我是个白痴。
今天,我花了一些时间在沙盒应用上,基本上获得了在沙盒 table 上运行的功能,但无法在应用的 table 上运行。最终我将范围缩小到这是一个数据库问题。是的...我以某种方式在我的连接中创建了 foreign_key 字段 table VARCHAR 而不是 INT。是的...就可以了。
好吧,我想我的意思是永远记录它...检查您的数据库字段并且 tables 设置正确!!!
我有两个模型与 Cake 中的 Has And Belongs To Many 关联关联 2.x。我正在尝试将我的应用程序移植到 Cake 3.3。通常,我在复制 Cake 2.x 关联中的 "keepExisting" 功能时遇到问题。现在,我正在尝试使用 "through" 功能,但我不确定我是否在寻找正确的树。
我有以下表格:
class ContestsTable extends Table
{
/**
* Initialize method
*
* @param array $config The configuration for the Table.
* @return void
*/
public function initialize(array $config)
{
parent::initialize($config);
$this->table('contests');
$this->displayField('name');
$this->primaryKey('id');
$this->addBehavior('Timestamp');
$this->belongsToMany('Events', [
'through' => 'ContestsEvents'
]);
}
}
class EventsTable extends Table
{
/**
* Initialize method
*
* @param array $config The configuration for the Table.
* @return void
*/
public function initialize(array $config)
{
parent::initialize($config);
$this->table('events');
$this->displayField('name');
$this->primaryKey('id');
$this->addBehavior('Timestamp');
$this->belongsToMany('Events', [
'saveStrategy' => 'append',
'through' => 'ContestsEvents'
]);
}
}
class ContestsEventsTable extends Table
{
public function initialize(array $config) {
$this->belongsTo('Contests');
$this->belongsTo('Events');
}
}
当我保存带有关联事件的初始比赛时,保存没有问题,关联记录是在加入 table 中创建的。当我编辑比赛记录并更改事件列表时,任何选定的事件都会被添加……但不再被选中的旧事件不会被删除。第二个问题是为已经存在的关系创建新的连接记录。我想保留现有记录而不是创建新记录。稍后在该应用程序中,我将在附加关系中使用连接记录 ID...并且我不希望每次更新覆盖的比赛记录时都重新生成该 ID。
我希望我在描述我正在尝试做的事情时是有意义的。但以最简单的形式,我试图复制通过 Cake 2x 中包含的 'unique' => 'keepExisting' 选项找到的功能,只是无法破解有关如何在 Cake 3.3 中实现此功能的代码?
在此先感谢您的帮助。
好的,就这样吧。首先,我认为我出于沮丧而写了上面的问题,如果不清楚,我深表歉意。我继续处理我应用程序的其他部分,这个问题一直困扰着我。好吧,我想通了...所以这是我的答案:
我是个白痴。
今天,我花了一些时间在沙盒应用上,基本上获得了在沙盒 table 上运行的功能,但无法在应用的 table 上运行。最终我将范围缩小到这是一个数据库问题。是的...我以某种方式在我的连接中创建了 foreign_key 字段 table VARCHAR 而不是 INT。是的...就可以了。
好吧,我想我的意思是永远记录它...检查您的数据库字段并且 tables 设置正确!!!