也许我的问题听起来有点奇怪。所以这里有详细信息:
我创建了两个类“Position”和“Step”。此外,每一步都可以包含职位。我的表格和相关字段如下所示:
/**
* functionDescList is your array list of DeviceFunctionModel class type
*
*/
Intent intent=new Intent(mContext,DeviceOptions.class);
Bundle bundle= new Bundle();
bundle.putParcelableArrayList("DeviceFunctionModel", functionDescList);
intent.putExtras(bundle);
mContext.startActivity(intent);
//in calling class just get the parcelable arraylist
Bundle bundle=getIntent().getExtras();
ArrayList<DeviceFunctionModel>functionDescList=bundle.getParcelableArrayList("DeviceFunctionModel");
我认为这是一个正常的1:n关系,因为每个步骤都可以存储n个位置,每个位置只能是一个步骤的一部分。
我的课程和相关属性如下所示:
CREATE TABLE tx_foxexample_domain_model_step (
...
positions int(11) unsigned DEFAULT '0' NOT NULL,
...
);
CREATE TABLE tx_foxexample_domain_model_position (
...
step int(11) unsigned DEFAULT '0' NOT NULL,
...
);
该步骤将n位置存储在对象存储属性中,该位置只将相关步骤存储在步骤属性中。
到目前为止,我已经通过内联字段直接内联创建了一个位置或一些位置,我的步骤的TCA如下:
class Step extends AbstractEntity
{
...
/**
* Positions
*
* @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Fox\FoxExample\Domain\Model\Position>
* @cascade remove
*/
protected $positions = null;
...
}
class Position extends AbstractEntity
{
...
/**
* Stores the relation to step
*
* @var \Fox\FoxExample\Domain\Model\Step
*/
protected $step = null;
...
}
因此,位置和步骤关系被正确保存到数据库中,但由于某些原因,我已经改变很多,并且不再需要在步骤内创建位置,因为位置已经存在且用户必须选择位置这是必要的。所以我将内联类型更改为多选字段:
...
'positions' => array(
'exclude' => 1,
'label' => '...',
'config' => array(
'type' => 'inline',
'foreign_table' => 'tx_foxexample_domain_model_position',
'foreign_field' => 'step',
'maxitems' => 50,
'appearance' => array(
'collapseAll' => 1,
'levelLinksPosition' => 'top',
'showSynchronizationLink' => 1,
'showPossibleLocalizationRecords' => 1,
'showAllLocalizationLink' => 1
),
),
),
...
通过此更改,用户可以为每个步骤选择相关位置,但是如果我查看数据库表,我可以看到我的位置表的步骤字段始终为0,并且我的步骤表的位置字段保持不变现在的位置uid。
所以我遇到了一些麻烦,因为我无法为多选字段定义'foreign_field',因此与位置表的关系消失了。此外,我只能添加一个位置,因为只保存一个位置,其他选定位置将被忽略,因为只存储一个uid。
总之,我想保留多选字段的内联字段行为。如何保持多选字段的内联字段行为?
答案 0 :(得分:0)
您可能需要一个MM-Table,因为一个步骤可以有多个位置,一个位置可以分多步分配。我建议引入一个表tx_foxexample_step_position_mm
:
CREATE TABLE tx_foxexample_step_position_mm (
uid_local int(11) DEFAULT '0' NOT NULL,
uid_foreign int(11) DEFAULT '0' NOT NULL,
sorting int(11) DEFAULT '0' NOT NULL,
KEY uid_local (uid_local),
KEY uid_foreign (uid_foreign)
);
你告诉你的TCA使用它(休息保持不变):
'positions' => array(
'config' => array(
'MM' => 'tx_foxexample_step_position_mm'
),
),
现在您需要将现有数据迁移到新结构。我建议编写一个CommandController,用当前关系填充MM表。