CakePHP 3在连接表中保存额外数据

pt0*_*pt0 2 orm save cakephp-3.0

$this->request-data需要修改数据,因此我无法直接使用表单填充所有表.在添加"状态"列之前,所有代码都已烘焙.

order_id    int(11) PK
part_id int(11) PK
state   varchar(10)
Run Code Online (Sandbox Code Playgroud)

我从中获取ID $this->request-data并相应地修改它:

$this->request->data['parts']['_ids'][]=....
Run Code Online (Sandbox Code Playgroud)

其余的根据手册:

$order = $this->Orders->newEntity();
$this->Orders->patchEntity($order, $this->request->data);
$this->Orders->save($order);
Run Code Online (Sandbox Code Playgroud)

我无法修改传入数据以将其保存到状态列

编辑:

"state"字段仍为null值.

OrdersTable中

public function initialize(array $config)
{
    parent::initialize($config);

    $this->table('orders');
    $this->displayField('id');
    $this->primaryKey('id');

    $this->addBehavior('Timestamp');

    $this->belongsTo('Users', [
        'foreignKey' => 'user_id',
        'joinType' => 'INNER',
    ]);
    $this->belongsToMany('Parts', [
        'foreignKey' => 'order_id',
        'targetForeignKey' => 'part_id',
        'joinTable' => 'orders_parts',
        'through' => 'OrdersParts',

    ]);
    $this->belongsToMany('Sets', [
        'foreignKey' => 'order_id',
        'targetForeignKey' => 'set_id',
        'joinTable' => 'orders_sets',
    ]);
}
Run Code Online (Sandbox Code Playgroud)

OrdersTable中

public function initialize(array $config)
{
    parent::initialize($config);

    $this->table('parts');
    $this->displayField('name');
    $this->primaryKey('id');

    $this->addBehavior('Timestamp');


    $this->belongsTo('Orders', [
        'foreignKey' => 'order_id',
        'joinType' => 'INNER',
    ]);

    $this->belongsToMany('Orders', [
        'foreignKey' => 'part_id',
        'targetForeignKey' => 'order_id',
        'joinTable' => 'orders_parts',

    ]);

    $this->belongsToMany('States', [
        'foreignKey' => 'part_id',
        'targetForeignKey' => 'state_id',
        'joinTable' => 'parts_states'
    ]);
}
Run Code Online (Sandbox Code Playgroud)

插入:

$order = $this->Orders->newEntity();
$order->status = 'new';
$order->user_id = $this->Auth->user('id');
$this->request->data['parts'][0]['_joinData']['state'] = "whatever";
$this->Orders->patchEntity(
$order,
$this->request->data,
['associated' => ['Sets','Parts._joinData']]
);

$this->Orders->save(
$order,
['associated' => ['Sets','Parts._joinData']]
);
Run Code Online (Sandbox Code Playgroud)

我必须将aslo SetsModel包含在关联的中.

Cor*_*eau 7

$ this-> request-> data ['parts'] ['_ ids']允许您连接表,但不能以这种方式添加数据.为此,您的$ this-> request-> data ['parts']结构必须如下所示:

'parts' => [
    0 => [
        'id'=> 1,
        '_joinData' => [
            'state' => 'exampleSate'
        ]
    ]
]
Run Code Online (Sandbox Code Playgroud)

确保您的'parts'数组中不再包含'_ids'数组,否则您将无法将数据保存到连接表中.
'id'字段对应于相关部分的id.设置它:

$this->request->data['parts'][0]['id'] = <idOfTheConcernedPart>;
Run Code Online (Sandbox Code Playgroud)


要设置"州"字段,只需执行以下操作:

$this->request->data['parts'][0]['_joinData']['state'] = "whatever";
Run Code Online (Sandbox Code Playgroud)

最后你需要通过向patchEntity添加一些配置并保存方法来告诉cakephp你正在保存一些_joinData:

$this->Orders->patchEntity(
    $order, 
    $this->request->data, 
    ['associated' => ['Parts._joinData']]
);

$this->Orders->save(
    $order, 
    ['associated' => ['Parts._joinData']]
);
Run Code Online (Sandbox Code Playgroud)

我希望它有所帮助,
干杯.