【问题标题】:CakePHP 3 save extra data in join tableCakePHP 3 在连接表中保存额外数据
【发布时间】:2015-10-06 12:01:17
【问题描述】:

$this->request-data 的数据需要修改,所以我不能直接使用表单来填充所有表格。在我添加“状态”列之前,所有代码都已烘焙。

order_id    int(11) PK
part_id int(11) PK
state   varchar(10)

我从 $this->request-data 获取 id 并进行相应修改:

$this->request->data['parts']['_ids'][]=....

其余的按照手册进行:

$order = $this->Orders->newEntity();
$this->Orders->patchEntity($order, $this->request->data);
$this->Orders->save($order);

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

编辑:

“状态”字段仍为空值。

订单表

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',
    ]);
}

订单表

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'
    ]);
}

插入:

$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']]
);

我必须将 SetsModel 也包含到关联中。

【问题讨论】:

    标签: orm save cakephp-3.0


    【解决方案1】:

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

    'parts' => [
        0 => [
            'id'=> 1,
            '_joinData' => [
                'state' => 'exampleSate'
            ]
        ]
    ]
    

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

    $this->request->data['parts'][0]['id'] = <idOfTheConcernedPart>;
    


    要设置您的“状态”字段,只需执行以下操作:

    $this->request->data['parts'][0]['_joinData']['state'] = "whatever";
    

    最后你需要告诉 cakephp 你正在保存一些 _joinData 通过添加一些配置到你的 patchEntity 和 save 方法:

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

    希望对你有帮助
    干杯。

    【讨论】:

    • 我已经编辑了主要问题,因为我仍然没有得到预期的结果。
    • 你忘了输入 id 字段:$this->request->data['parts'][0]['id'] = ;
    • 感谢您的说明。我发现的是 $this->request->data 格式错误(因此无法填充状态列)。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多